UIwindow的學習

UIwindow 的學習php

 

層級關係測試代碼:windows

 

@interface AppDelegate ()

@property (nonatomic, strong) UIWindow *arlewWindow;
@property (nonatomic, strong) UIWindow *norWindow;
@property (nonatomic, strong) UIWindow *statusWindow;

@end

 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // UIStoryboard中沒有設置了程序入口箭頭
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor greenColor];
    UIStoryboard *story = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *oneView = [story instantiateViewControllerWithIdentifier:@"123"];
    self.window.rootViewController = oneView;
    NSLog(@"%f",self.window.windowLevel);
    [self.window makeKeyAndVisible];
    
    // 最低級別
    UIWindow *norWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 320, 520)];
    self.norWindow = norWindow;
    norWindow.windowLevel = UIWindowLevelNormal + 1;
    norWindow.backgroundColor = [UIColor redColor];
    NSLog(@"norWindow.windowLevel:%f",norWindow.windowLevel);
    [norWindow makeKeyAndVisible];
    
    // 中等級別
    UIWindow *statusWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0, 50, 100, 100)];
    self.statusWindow = statusWindow;
    statusWindow.windowLevel = UIWindowLevelStatusBar;
    statusWindow.backgroundColor = [UIColor grayColor];
    NSLog(@"statusWindow.windowLevel:%f",statusWindow.windowLevel);
    [statusWindow makeKeyAndVisible];
    
    // 最高級別
    UIWindow *arlewWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0, 100, 320, 30)];
    self.arlewWindow = arlewWindow;
    arlewWindow.windowLevel = UIWindowLevelAlert;
    arlewWindow.backgroundColor = [UIColor yellowColor];
    NSLog(@"arlewWindow.windowLevel:%f",arlewWindow.windowLevel);
    [arlewWindow makeKeyAndVisible];
    
    // 通過總結,self.window.windowLevel默認是UIWindowLevelNormal,window按照層級級別來顯示,無論誰先誰後makeKeyAndVisible,層級最高的老是顯示在前面,若是是相同層級的window,按照顯示順序是按照 [_window makeKeyAndVisible];的順序顯示,最後makeKeyAndVisible的window顯示在最前面。小技巧:若是想要設置不大不小的層級級別,能夠norWindow.windowLevel = UIWindowLevelNormal + 1;來增長級別權限。
    // 若是是非ARC模式測驗則沒問題,可是在ARC模式下測驗則會不顯示其餘window,只會顯示self.window,由於其餘的window沒有strong進行引用,沒有人持有,會被釋放掉,若是想在ARC下測試,則要將window定義爲類的屬性
    
    
    return YES;
}

 

// 經過遍歷以及打印信息提取本身想要的app中得window
for (UIWindow *window in [UIApplication sharedApplication].windows) {
        NSLog(@"window:%@, %f",window, window.windowLevel);
        
        
    }
    // 取出self.window
    UIWindow *window = [[UIApplication sharedApplication].windows objectAtIndex:2];
    // 增長self.window的層級權限
    window.windowLevel = UIWindowLevelNormal + 30;

 

 

若是你的window在某個類中作爲屬性建立,而且使用完後保證沒有其餘地方strong引用window的話,那麼這個類釋放的時候,window屬性天然就釋放了。app

 

[UIApplication sharedApplication].windows  // 在本應用中打開的UIWindow列表ide

[UIApplication sharedApplication].keyWindow  //(獲取應用程序的主窗口)學習

//UIScreen屏幕屬性測試

@property(nonatomic,retain) UIScreen *screen動畫

 

keyWindowui

 官方解釋keyWindow是惟一一個能夠接受響應的Window,在一個應用程序中只有惟一一個keyWindowatom

    可是iOS7.0檢驗發現非keyWindow也是能夠接受鍵盤消息,這一點和文檔上說的不太同樣。url

 

層級

// UIWindowLevel屬性(層級高度)

@property(nonatomic) UIWindowLevel windowLevel; 

// 定義UIWindow展現優先級不一樣層次的選擇 ,根據window顯示級別優先的原則,級別高的灰顯示在上面,級別低的在下面,咱們程序正常顯示的位於最底層

UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal; //默認的window就是Normal級別,優先級值這個層次的值爲0,一般咱們程序的界面都是處於這個Normal級別的

UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert; //屏幕的statusBar處於中等水平,優先級值爲1000

UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar;// alert級別的,一般是UIAlertView和UIAlertSheet這些用來中斷正常流程,提醒用戶等操做的。優先級值爲2000.按照這樣說來,alertView彈框出來下面也是一層UIWindow,只不過是優先級最高的alert級別,因此是keyWindow,當前只能交互alert,這就是爲何彈框出來其餘界面都不可交互的緣由 (UIAlertView爲1996,UIAlertSheet爲2001)

 

方法

 

- (void)becomeKeyWindow; // 調用窗口,使之變成關鍵窗口(設置當前window變成主window

- (void)resignKeyWindow;  //  調用窗口,使之取消關鍵窗口(設置當前window變成主window

- (void)makeKeyWindow;     // 使之成爲主窗口(讓當前window變成keyWindow)

- (void)makeKeyAndVisible;  // 使之成爲主窗口,而且顯示(讓當前window變成keyWindow,並顯示出來

 

類的屬性

 

@property(nonatomic,retain) UIViewController *rootViewController // 根控制器(設置UIViewController爲根控制器

 

// 當產生一個事件時,先傳遞給UIApplication,而UIAppliaction將這個事件傳遞UIWindow進行處理,而後由UIWindow將這個時間傳遞給特定的對象,即first responder,而UIWindow就是經過sendEvent尋找first responder,通過sendEvent分發到合適的對象,sendEvent就至關於時間的中轉站。

- (void)sendEvent:(UIEvent *)event;

 

通知

 

// window變化的四個通知

UIKIT_EXTERN NSString *const UIWindowDidBecomeVisibleNotification; //當window顯示就會調用

UIKIT_EXTERN NSString *const UIWindowDidBecomeHiddenNotification;  //window被隱藏以後調用,須要注意的是,當程序進入後臺時,這兩個通知不會被調用,即便應用轉到後臺,窗口不會顯示,窗口應用下的上下文中仍然被認爲是可見的

UIKIT_EXTERN NSString *const UIWindowDidBecomeKeyNotification;     //window成爲主窗口調用

UIKIT_EXTERN NSString *const UIWindowDidResignKeyNotification;     //window撤銷主窗口調用

 

// 監聽鍵盤變化的通知

UIKIT_EXTERN NSString *const UIKeyboardWillShowNotification; //當鍵盤將要顯示的時候調用

UIKIT_EXTERN NSString *const UIKeyboardDidShowNotification; //當鍵盤已經顯示的時候調用

UIKIT_EXTERN NSString *const UIKeyboardWillHideNotification; //當鍵盤將要隱藏的時候調用

UIKIT_EXTERN NSString *const UIKeyboardDidHideNotification; //當鍵盤隱藏完畢的時候調用

 

// 關於監聽鍵盤通知的一些userInfo消息

UIKIT_EXTERN NSString *const UIKeyboardFrameBeginUserInfoKey       NS_AVAILABLE_IOS(3_2); //動畫前鍵盤的位置,包含CGRectNSValue 能夠在通知方法中寫獲得位置

CGRect rect = [[notif.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];

UIKIT_EXTERN NSString *const UIKeyboardFrameEndUserInfoKey         NS_AVAILABLE_IOS(3_2); //動畫結束後鍵盤的位置  包含CGRectNSValue

UIKIT_EXTERN NSString *const UIKeyboardAnimationDurationUserInfoKeyNS_AVAILABLE_IOS(3_0); //動畫的持續時間,數值是NSNumber

UIKIT_EXTERN NSString *const UIKeyboardAnimationCurveUserInfoKey   NS_AVAILABLE_IOS(3_0); //動畫的曲線類型(UIViewAnimationCurve),數值是NSNumber

 

// 監聽鍵盤frame大小變化的通知

UIKIT_EXTERN NSString *const UIKeyboardWillChangeFrameNotification NS_AVAILABLE_IOS(5_0); //當鍵盤frame值將要改變的時候調用

UIKIT_EXTERN NSString *const UIKeyboardDidChangeFrameNotification  NS_AVAILABLE_IOS(5_0); //當鍵盤frame值已經改變的時候調用

相關文章
相關標籤/搜索