zoukankan      html  css  js  c++  java
  • UIWindow

    UIWindow.h文件
        1、    IOS  
    /Applications//Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIWindow.h
    /Applications//Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIWindow.h

    一、UIWindow介绍

    [1]、UIWindow是一种特殊的UIView(视图集合中的根view),每个UIWindow都有一个窗口等级(windowlevel),通常在一个程序中只会有一个UIWindow,可以手动创建多个UIWindow。UIWindow在程序中主要起到三个作用:

      1、作为容器,包含app显示的所有视图
      2、传递触摸消息到程序中view和其他对象
      3、与UIViewController协同工作,方便完成设备方向旋转的支持


    [2]、通常我们可以采取两种方法将view添加到UIWindow中:

      1、addSubview
      直接将view通过addSubview方式添加到window中,程序负责维护view的生命周期以及刷新,但是并不会为去理会view对应的ViewController,因此采用这种方法将view添加到window以后,我们还要保持view对应的ViewController的有效性,不能过早释放

      2、rootViewController
      rootViewController是UIWindow的一个遍历方法,通过设置该属性为要添加view对应的ViewController,UIWindow将会自动将其view添加到当前window中,同时负责ViewController和view的生命周期的维护,防止其过早释放。


           3、keyWindow : BOOL 类型,只读,用于判断是否是当前应用的 key window (key window 是指可接收到键盘输入及其他非触摸事件的 UIWindow,一次只能有一个 key window)

           4、windowLevel :UIWindowLevel 类型,多个 UIWindow 的显示顺序是按照 windowLevel 从高到低排列的,windowLevel 最高的显示在最前面。比如:windowLevel 较高的 UIAlertView 警告窗口会显示在一般窗口的前面。UIWindowLevel 类型的定义如下:


    typedef CGFloat UIWindowLevel;
    UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal; //默认等级
    UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert; //UIAlert等级
    UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatsBar; //状态栏等级


    打印结果如下:
    NSLog(@"%f", UIWindowLevelNormal);
    NSLog(@"%f", UIWindowLevelAlert);
    NSLog(@"%f", UIWindowLevelStatusBar);
    2013-03-16 10:00:48.925 iosDemo[1033:11303] 0.000000
    2013-03-16 10:00:48.927 iosDemo[1033:11303] 2000.000000
    2013-03-16 10:00:48.927 iosDemo[1033:11303] 1000.000000


    5、makeKeyWindow :将当前 UIWindow 设置成应用的 key window。


    6、makeKeyAndVisible :将当前 UIWindow 设置成应用的 key window,并使得 UIWindow 可见;也可以使用 UIView 的 hidden 属性来显示或者隐藏一个 UIWindow。

    1、- (void)becomeKeyWindow;                               // override point for subclass. Do not call directly 调用窗口,使之变成关键窗口
    2、- (void)resignKeyWindow;                               // override point for subclass. Do not call directly  调用窗口,使之取消关键窗口
    3、- (void)makeKeyWindow;   使之成为主窗口 
    4、- (void)makeKeyAndVisible;                             // convenience. most apps call this to show the main window and also make it key. otherwise use view hidden property 使之成为主窗口,并且显示
    5、- (void)sendEvent:(UIEvent *)event;                    // called by UIApplication to dispatch events to views inside the window 事件拦截分发到指定视图对象

    当用户发起一个事件,比如触摸屏幕或者晃动设备,系统产生一个事件,同时投递给UIApplication,而UIApplication则将这个事件传递给特定的UIWindow进行处理(正常情况都一个程序都只有一个UIWindow),然后由UIWindow将这个事件传递给特定的对象(即first responder)并通过响应链进行处理。虽然都是通过响应链对事件进行处理,但是触摸事件和运动事件在处理上有着明显的不同(主要体现在确定哪个对象才是他们的first responder):

     窗口坐标系统转化

    6、- (CGPoint)convertPoint:(CGPoint)point toWindow:(UIWindow *)window;    // can be used to convert to another window 转化当前窗口一个坐标相对另外一个窗口的坐标
    7、- (CGPoint)convertPoint:(CGPoint)point fromWindow:(UIWindow *)window;  // pass in nil to mean screen  转化另外窗口一个坐标相对于当前窗口的坐标
    8、- (CGRect)convertRect:(CGRect)rect toWindow:(UIWindow *)window;   转化当前窗口一个矩形坐标相对另外一个窗口的坐标
    9、- (CGRect)convertRect:(CGRect)rect fromWindow:(UIWindow *)window; 转化另外窗口一个矩形坐标相对于当前窗口的坐标


    二 、UIWindow.h分析

    复制代码
    //  UIWindow.h
    //  UIKit
    //
    //  Copyright (c) 2005-2012, Apple Inc. All rights reserved.
    //
    
    
    #import <Foundation/Foundation.h>基础框架入口
    #import <CoreGraphics/CoreGraphics.h>绘图入口
    #import <UIKit/UIView.h>视图对象
    #import <UIKit/UIApplication.h>提供IOS程序运行期的协作和控制
    #import <UIKit/UIKitDefines.h>一些宏定义
    
    
    typedef CGFloat UIWindowLevel; 32位则为float | 64位为double
    
    
    @class UIEvent, UIScreen, NSUndoManager, UIViewController; //UIEvent 触摸事件,运动事件
    //UIScreen 屏幕处理
    //NSUndoManager  记录撤销,修改操作的消息//UIViewController 视图控制器
    NS_CLASS_AVAILABLE_IOS(2_0) @interface UIWindow : UIView {
      @package
        id                       _delegate;
        CGFloat                  _windowLevel;
        CGFloat                  _windowSublevel;
        id                       _layerContext;
        UIView                  *_lastMouseDownView;
        UIView                  *_lastMouseEnteredView;
        UIResponder             *_firstResponder;
        id                       _fingerInfo;
        id                       _touchData;
        UIInterfaceOrientation   _viewOrientation;
        UIView                  *_exclusiveTouchView;
        NSUndoManager           *_undoManager;
        UIScreen                *_screen;
        CALayer                 *_transformLayer;
        NSMutableArray          *_rotationViewControllers;
        UIViewController        *_rootViewController;
        UIColor                 *_savedBackgroundColor;
        NSMutableSet            *_subtreeMonitoringViews;
        NSMutableSet            *_tintViews;
        id                      _currentTintView;
        struct {
    unsigned int delegateWillRotate:1;
            unsigned int delegateDidRotate:1;
            unsigned int delegateWillAnimateFirstHalf:1;
            unsigned int delegateDidAnimationFirstHalf:1;
            unsigned int delegateWillAnimateSecondHalf:1;
            unsigned int autorotatesToPortrait:1;
            unsigned int autorotatesToPortraitUpsideDown:1;
            unsigned int autorotatesToLandscapeLeft:1;
            unsigned int autorotatesToLandscapeRight:1;
            unsigned int dontBecomeKeyOnOrderFront:1;
            unsigned int output:1;
            unsigned int inGesture:1;
            unsigned int bitsPerComponent:4;
            unsigned int autorotates:1;
            unsigned int isRotating:1;
            unsigned int isUsingOnePartRotationAnimation:1;
            unsigned int isHandlingContentRotation:1;
            unsigned int disableAutorotationCount:4;
            unsigned int needsAutorotationWhenReenabled:1;
            unsigned int forceTwoPartRotationAnimation:1;
            unsigned int orderKeyboardInAfterRotating:1;
            unsigned int roundedCorners:4;
            unsigned int resizesToFullScreen:1;
            unsigned int keepContextInBackground:1;
            unsigned int ignoreSetHidden:1;
            unsigned int forceVisibleOnInit:1;
            unsigned int settingFirstResponder:1;
            unsigned int legacyOrientationChecks:1;
            unsigned int windowResizedToFullScreen:1;
        } _windowFlags;
    
        id _windowController;
    }
    
    
    @property(nonatomic,retain) UIScreen *screen NS_AVAILABLE_IOS(3_2);  // default is [UIScreen mainScreen]. changing the screen may be an expensive operation and should not be done in performance-sensitive code
    
    
    @property(nonatomic) UIWindowLevel windowLevel;                   // default = 0.0
    @property(nonatomic,readonly,getter=isKeyWindow) BOOL keyWindow;
    - (void)becomeKeyWindow;                               // override point for subclass. Do not call directly 调用窗口,使之变成关键窗口
    - (void)resignKeyWindow;                               // override point for subclass. Do not call directly 调用窗口,使之取消关键窗口
    
    
    - (void)makeKeyWindow;     使之成为主窗口
    - (void)makeKeyAndVisible;                             // convenience. most apps call this to show the main window and also make it key. otherwise use view hidden property 使之成为主窗口,并且显示
    
    
    @property(nonatomic,retain) UIViewController *rootViewController NS_AVAILABLE_IOS(4_0);  // default is nil 
    
    
    - (void)sendEvent:(UIEvent *)event;                    // called by UIApplication to dispatch events to views inside the window 事件拦截分发到指定视图对象
    当用户发起一个事件,比如触摸屏幕或者晃动设备,系统产生一个事件,同时投递给UIApplication,而UIApplication则将这个事件传递给特定的UIWindow进行处理(正常情况都一个程序都只有一个UIWindow),然后由UIWindow将这个事件传递给
    特定的对象(即first responder)
    并通过响应链进行处理。虽然都是通过响应链对事件进行处理,但是触摸事件和运动事件在处理上有着明显的不同(主要体现在确定哪个对象才是他们的first responder):
    
    
    窗口坐标系统转化
    
    - (CGPoint)convertPoint:(CGPoint)point toWindow:(UIWindow *)window;    // can be used to convert to another window 转化一个坐标到另外窗口
    - (CGPoint)convertPoint:(CGPoint)point fromWindow:(UIWindow *)window;  // pass in nil to mean screen 转化一个坐标从另外窗口
    - (CGRect)convertRect:(CGRect)rect toWindow:(UIWindow *)window; 转化一个矩形到另外窗口
    - (CGRect)convertRect:(CGRect)rect fromWindow:(UIWindow *)window; 转化一个矩形从另外窗口
    
    
    @end
    
    
    UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal; 默认等级
    UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert; UIAlert等级
    UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar; 状态栏等级
    
    
    UIKIT_EXTERN NSString *const UIWindowDidBecomeVisibleNotification; // nil 通知对象窗口为可见
    UIKIT_EXTERN NSString *const UIWindowDidBecomeHiddenNotification;  // nil通知对象窗口为隐藏
    UIKIT_EXTERN NSString *const UIWindowDidBecomeKeyNotification;     // nil 通知对象窗口为重要
    UIKIT_EXTERN NSString *const UIWindowDidResignKeyNotification;     // nil  通知对象窗口取消主窗口状态
    
    
    // Each notification includes a nil object and a userInfo dictionary containing the
    // begining and ending keyboard frame in screen coordinates. Use the various UIView and
    // UIWindow convertRect facilities to get the frame in the desired coordinate system.
    // Animation key/value pairs are only available for the "will" family of notification.
    UIKIT_EXTERN NSString *const UIKeyboardWillShowNotification;通知键盘对象视图即将加载
    UIKIT_EXTERN NSString *const UIKeyboardDidShowNotification; 通知键盘对象视图完全加载
    UIKIT_EXTERN NSString *const UIKeyboardWillHideNotification;  通知键盘对象视图即将隐藏
    UIKIT_EXTERN NSString *const UIKeyboardDidHideNotification;  通知键盘对象视图完全隐藏
    
    
    UIKIT_EXTERN NSString *const UIKeyboardFrameBeginUserInfoKey        NS_AVAILABLE_IOS(3_2); // NSValue of CGRect 指明键盘动画之前的框架,键盘将要显示时,显示之前把框架传递给这个动画;键盘已经显示即将隐藏时,键盘消失之前将这个框架传递给一个隐藏动画。包含一个CGRct类型值。
    UIKIT_EXTERN NSString *const UIKeyboardFrameEndUserInfoKey          NS_AVAILABLE_IOS(3_2); // NSValue of CGRect 指明动画完成后的键盘框架,键盘将要显示时,键盘完全显示后把框架传递给键盘;键盘已经显示即将隐藏时,键盘隐藏后将这个框架传递给一个键盘。包含一个CGRct类型值。
    UIKIT_EXTERN NSString *const UIKeyboardAnimationDurationUserInfoKey NS_AVAILABLE_IOS(3_0); // NSNumber of double 指明键盘显示和隐藏动画所用时间,包好一个NSNumber类型值(double)
    UIKIT_EXTERN NSString *const UIKeyboardAnimationCurveUserInfoKey    NS_AVAILABLE_IOS(3_0); // NSNumber of NSUInteger (UIViewAnimationCurve)指明动画类型,用来显示和隐藏键盘,包含了一个NSnumber类型值(NSUInteger)
    
    
    // Like the standard keyboard notifications above, these additional notifications include
    // a nil object and begin/end frames of the keyboard in screen coordinates in the userInfo dictionary.
    UIKIT_EXTERN NSString *const UIKeyboardWillChangeFrameNotification  NS_AVAILABLE_IOS(5_0);键盘即将改变布局发出通知
    UIKIT_EXTERN NSString *const UIKeyboardDidChangeFrameNotification   NS_AVAILABLE_IOS(5_0);键盘已经改变布局后发出通知
    
    
    // These keys are superseded by UIKeyboardFrameBeginUserInfoKey and UIKeyboardFrameEndUserInfoKey.
    UIKIT_EXTERN NSString *const UIKeyboardCenterBeginUserInfoKey   NS_DEPRECATED_IOS(2_0, 3_2); 键盘开始动画之前的起始坐标
    UIKIT_EXTERN NSString *const UIKeyboardCenterEndUserInfoKey     NS_DEPRECATED_IOS(2_0, 3_2); 键盘动画后的坐标
    UIKIT_EXTERN NSString *const UIKeyboardBoundsUserInfoKey        NS_DEPRECATED_IOS(2_0, 3_2); 包含的矩形只能用于取得尺寸信息
    复制代码

     

  • 相关阅读:
    Github使用手册2——Github使用自己的远程仓库
    GitHub使用手册1——fork and pull request
    如何申请Pycharm学生免费激活码
    博客园入园手册2——Markdown编辑器1
    博客园入园手册1——TinyMEC编辑器
    实验一 GIT 代码版本管理
    结对项目-数独程序扩展(要求细化更新)
    个人作业Week2-代码复审(修改明确了要求)
    个人作业-Week1(新增详细说明)
    个人项目-数独
  • 原文地址:https://www.cnblogs.com/liuxiaokun/p/5544821.html
Copyright © 2011-2022 走看看