UIwindow的学习

UIwindow 的学习

层级关系测试代码:

@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属性自然就释放了。

[UIApplication sharedApplication].windows  // 在本应用中打开的UIWindow列表

[UIApplication sharedApplication].keyWindow  //(获取应用程序的主窗口)

//UIScreen屏幕属性

@property(nonatomic,retain) UIScreen *screen

keyWindow

 官方解释keyWindow是唯一一个可以接受响应的Window,在一个应用程序中只有唯一一个keyWindow

但是iOS7.0检验发现非keyWindow也是可以接受键盘消息,这一点和文档上说的不太一样。

层级

// 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); //动画前键盘的位置,包含CGRect的NSValue 可以在通知方法中写得到位置

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

UIKIT_EXTERN NSString *const UIKeyboardFrameEndUserInfoKey         NS_AVAILABLE_IOS(3_2); //动画结束后键盘的位置  包含CGRect的NSValue

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值已经改变的时候调用

时间: 2024-10-25 16:09:49

UIwindow的学习的相关文章

UIView 和 UIWindow 的学习内容

UIWindow是UIView的子类,一个程序只能有一个window主窗口. 在XCode7之后我们创建UIWindow的对象,代码如下: //创建一个窗口,使其铺满屏幕(设置大小)          初始化的时候不要用self.window,这样相当于先调用setter方法再申请空间,可能会出现传值错误 _window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; //UIScreen mainScreen代表

UIWindow学习

写在前面 本文内容绝大部分都参考唐巧大神的<iOS开发进阶>,只是结合不是特别长的开发经验加以补充:最后基于UIWindow自定义了一个类似于微信的ActionSheet. UIWindow简介 在iOS App中,UIWindow是最顶层的界面内容,我们使用UIWindow和UIView来呈现界面.UIWindow并不包含任何默认的内容,但是它被当作UIView的容器,用于放置应用中所有的UIView. 从继承关系来看,UIWindow继承自UIView,所以UIWindow除了具有UIVi

iOS 开发学习之 User Interface(2)UIWindow 视窗

UIWindow 视窗 a. 所有的UI直接或间接的放在UIWindow之上. b. UIWindow 继承自UIView. c. 视窗的创建:初始化视窗对象,指定其尺寸,以主屏幕([UIScreen mainScreen])范围指定. d. 将视窗设置为主窗口并使其可见 [window makeKeyAndVisible]; 一个应用程序只有一个主窗口. /* AppDelegate.m - (BOOL)application:(UIApplication *)application didF

iOS UIWindow 与 windowLevel 学习

Pop几个关键点 KeyWindow :"The key window is the one that is designated to receive keyboard and other non-touch     related events. Only one window at a time may be the key window" 会使对象主窗口展示在最前端  makeKeyAndVisible  方法使 对象window成为了 KeyWindow  但是如果 keyW

【学习总结】IOS程序运行过程 、UIWindow 、controller 、 UIView 创建过程的总结

程序启动开始到view显示: 程序启动首先会执行main函数 - > UIApplicationMain函数: 程序启动 (加载框架,info文件,资源等) 执行Main函数 初始化UIApplication单例对象 初始化AppDelegate对象,并设为UIApplication对象的代理 然后调用UIApplication的didFinishLaunchingWithOptions方法创建UIWindow对象,设置rootViewController根控制器等 然后建立一个主事件循环,其中

UIWindow全部API学习。

写API的目的在于作为一个字典的作用.简单,明了,温习,复习. //1.定义一个CGFloat类型的UIWindowLevel,UIWindowLevel分为三种不同选择,定义了UIWindow不同层级的展示方式,UIWindow在现实的时候会根据三种不同选择进行不同的排序,即level高的将排在level比他低的层级前面. typedef CGFloat UIWindowLevel; //2.添加UIScreen屏幕属性 @property(nonatomic,retain) UIScreen

iOS开发-UI (一)补充 UIWindow UIView UIlabel

之前忘了把这些整理出来,现在补充一下,应该放在前面学习的 知识点: 1.UI的初步认识 2.UIWindow 3.UIView 4.UIlabel ======================== UI的初步认识 1.什么是UI(*) UI即User Interface(用户界面)的简称.UI设计则是指对软 件的人机交互.操作逻辑.界面美观的整体设计.好的UI设 计不仅是让软件变得有个性有品味,还要让软件的操作变得 舒适.简单.自由.充分体现软件的定位和特点. 2.第一个UI工程 1)UI工程的

UIWindow ,UIlable

1.创建window 1 //1.创建window,UIScreen是屏幕类,创建和屏幕等大的窗口 2 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 3 //2.背景颜色 4 //self.window.backgroundColor = [UIColor greenColor]; 9 10 self.window.backgroundColor = [UIColor whiteColor

IOS学习笔记 -- Modal和Quartz2D

一. Modal1.Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为止;Modal只是改变了View的现实,没有改变rootViewController 2.常用方法1>.以Modal的形式展示控制器- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion2>.关