@property(nonatomic,strong) UIScreen *screen
一個UIScreen對象對應一個實際設備的物理屏幕,該屬性默認爲[UIScreen mainScreen]。一個iPhone默認一個屏幕,而一個屏幕可以存在多個window,這也是APP中可以同時存在多個window的原因。
@property(nullable, nonatomic,strong) UIViewController *rootViewController;
該屬性爲window的根控制器,這個屬性是不能爲空的,必須進行賦值
@property(nullable, nonatomic, weak) UIWindowScene *windowScene API_AVAILABLE(ios(13.0)
ios13以上必須設置windowScene屬性,否則window不顯示
- (CGPoint)convertPoint:(CGPoint)point toWindow:(nullable UIWindow *)window; - (CGPoint)convertPoint:(CGPoint)point fromWindow:(nullable UIWindow *)window; - (CGRect)convertRect:(CGRect)rect toWindow:(nullable UIWindow *)window; - (CGRect)convertRect:(CGRect)rect fromWindow:(nullable UIWindow *)window;
window之間是相互獨立的,如果想要將兩個window的座標相互映射的時候,就需要用到以上幾個方法。
//1. 創建一個window對象,並用一個對象強持有它 //UIWindow的大小是通過frame自定義設置的,frame決定了這個窗口大小 UIWindow *testWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; testWindow.windowLevel = UIWindowLevelStatusBar; self.testWindow = testWindow; //2. 創建一個控制器,賦值爲window的根控制器 UIViewController *controller = [[UIViewController alloc] init]; testWindow.rootViewController = controller; //3.設置當前活動的windowScene對象 for (UIWindowScene *windowScene in [UIApplication sharedApplication].connectedScenes) { if (windowScene.activationState == UISceneActivationStateForegroundActive) { self.alertWindow.windowScene = windowScene; break; } } //4. 顯示窗口 [testWindow makeKeyAndVisible];
UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal; 0 UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert; 2000 UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar; 4000
self.testWindow.hidden = YES; self.testWindow = nil;