iOS는 업데이트를 했지만 저는 아직이라서 iOS 13.0입니다.
저 빼고 혼자서 발전하는 모습이 영 마음에 들지 않습니다..
contents
iOS 15.0
나 : 함수 있어요?
15.0 : 아니 없어요
나 : 없었어요?
15.0 : 없어요
나 : 아~ 있었는데?
15.0 : 아니 없어요 그냥
분명히 있었는데 죄다 deprecated 시켰더라구요? 정말 자비없다고 생각했습니다.
요즘 상태바 높이를 가져오는 코드를 짜고 있었는데, 마지막 남아있던 희망의 windows를 15.0이 가져갔습니다.
Status Bar Height
iOS 13.0 그리고 그 이전에는 어떻게 상태바 높이를 관리했는지 궁금하실겁니다.
iOS 2.0 - 13.0(deprecated)
extension UIApplication {
static var statusBarHeight: CGFloat {
return shared.statusBarFrame.height
}
}
Swift
복사
iOS 13.0부터 deprecated되는 코드입니다.
statusBarFrame이 iOS 13.0부터 deprecated되기 때문이죠.
statusBarFrame은 상태바의 네모 영역을 정의해주는 역할을 합니다. 그래서 그 네모 영역의 height를 가져와서 쓰는 것이죠.
iOS 2.0 - 15.0(deprecated)
extension UIApplication {
static var statusBarHeight: CGFloat {
if #available(iOS 13.0, *) {
let window = shared.windows.filter { $0.isKeyWindow }.first
return window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
}
}
}
Swift
복사
windows는 앱에서 보이거나 보이지 않는(hidden) 창들을 말합니다.
그래서 안에 배열 형태로 만들어져 있어요.
그러면 UIWindow는 또 무엇인가 싶을거예요.
UIWindow : 앱의 사용자 인터페이스 배경 및 뷰에 이벤트를 디스패치하는 개체입니다.
ViewController들과 함께 이벤트를 다루고 앱의 기초적인 수행을 해주는 친구입니다.
우리는 이럴 때 Windows를 사용합니다.
•
Provide a main window to display your app’s content.
•
Create additional windows (as needed) to display additional content.
그러면 Window는 어디에 있나요?
Window의 다양한 사용
isKeyWindow : 지금의 Window가 KeyWindow인지 Boolean값을 보내줍니다.
KeyWindow?
isKeyWindow는
iOS 15.0 이후
이 Scene의 Key Window일 때, true
iOS 14.0 이전
이 App의 Key Window일 때, true
windowScene : Scene에서 현재 보이는 창들(Windows)을 관리해주는 UIWindowScene 객체
•
당신의 window가 보이는 걸 관리
•
사용자가 상호작용하는 Scene들의 Life Cycle를 관리
•
Scene의 상태가 바뀌면 → delegate object에서 알림(UIWindowSceneDelegate 프로토콜 채택)
statusBarManager : 상태 표시줄에 대한 세부 정보(숨김 여부 등)를 가져오려면 이 객체를 사용합니다.
•
UIWindowScene 객체를 통해서 statusBarManager를 가져올 수 있습니다.
•
이걸 사용해서 Default 상태바의 모양을 바꿀 수는 없어요. 각각 ViewController에서의 상태바 모양 변경은 가능합니다.
•
Default 모양을 바꾸고 싶다면 'override the prefersStatusBarHiddenproperty of your view controller.'
iOS 15.0 +
import UIKit
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let _ = (scene as? UIWindowScene) else { return }
if let statusBarHeight = window?.windowScene?.statusBarManager?.statusBarFrame.height {
SceneDelegateDataGetter.shared.height = statusBarHeight
print("statusBarHeight: \(statusBarHeight)")
}
}
}
class SceneDelegateDataGetter {
static let shared = SceneDelegateDataGetter()
public fileprivate(set) var height: CGFloat = 0
}
Swift
복사
위와는 동일하지만 SceneDelegate 를 통해서 height를 가져왔습니다.