使用UIWindow

UIWindow并不包含任何默認(rèn)的內(nèi)容,但是它被當(dāng)作UIView的容器,用于放置應(yīng)用中所有的UIView。UIWindow更多的時(shí)候只作為UIView的頂層容器存在。
而我們最常用的方法,就是在程序剛啟動(dòng)時(shí),調(diào)用UIWindow的makeAndVisible方法,代碼如下:


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    ViewController *vc = [[ViewController alloc] init];
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
    self.window.rootViewController = nav;
    [self.window makeKeyAndVisible];
    return YES;
}```
我們可以在UIWindow做一些操作:

// 取得最上面的window self代表一個(gè)view
UIWindow *window = [[UIApplication sharedApplication].windows lastObject];
[window addSubview:self];

WindowLevel屬性
不是所有創(chuàng)建的UIWindow一定會(huì)覆蓋在界面的最上面,UIWindow有一個(gè)類型為“UIWindowLevel”的屬性,該屬性定義了UIWindow的層級(jí),系統(tǒng)定義的UIWindowLevel一共有3中取值:如下:

UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal;
UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert;
UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar

程序中默認(rèn)的UIWindow的層級(jí)是UIWindowLevelNormal。

手動(dòng)創(chuàng)建UIWindow

//創(chuàng)建UIWindown
_window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
_window.windowLevel = UIWindowLevelNormal;
_window.backgroundColor = [UIColor blueColor];
_window.hidden = NO;

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideUIWindown)];
[_window addGestureRecognizer:tap];

/**
隱藏UIWindown
*/

  • (void)hideUIWindown{
    _window.hidden = YES;
    _window = nil;
    }
在一個(gè)應(yīng)用程序中,想做一個(gè)密碼保護(hù)功能,在用戶從應(yīng)用的任何界面按Home鍵退出,過(guò)一段時(shí)間再?gòu)暮笈_(tái)切換回來(lái),顯示一個(gè)密碼輸入界面。只有用戶在輸入正確的密碼,才能夠進(jìn)入退出的界面。因?yàn)檫@個(gè)密碼輸入界面可能從任何應(yīng)用界面彈出,并且需要蓋在所有界面的最上層,所以它很適合用一個(gè)UIWindow來(lái)實(shí)現(xiàn)。

import "PasswordInputwindow.h"

@implementation PasswordInputwindow

  • (instancetype)shareInstance
    {
    static id shareInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    shareInstance = [[self alloc] initWithFrame:[UIScreen mainScreen].bounds];
    });
    return shareInstance;
    }
  • (instancetype)initWithFrame:(CGRect)frame
    {
    self = [super initWithFrame:frame];
    if (self) {
    UIViewController *vc = [[UIViewController alloc] init];
    vc.view.backgroundColor = [UIColor yellowColor];
    self.rootViewController = vc;

      UITextField *textfield = [[UITextField alloc] init];
      textfield.textColor = [UIColor blackColor];
      textfield.font = [UIFont systemFontOfSize:17];
      textfield.frame = CGRectMake(20, 120, [UIScreen mainScreen].bounds.size.width-40, 40);
      textfield.borderStyle = UITextBorderStyleRoundedRect;
      textfield.placeholder = @"在這里輸入密碼";
      [vc.view addSubview:textfield];
      
      UIButton *btn = [[UIButton alloc] init];
      [btn setTitle:@"隱藏界面" forState:UIControlStateNormal];
      [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
      btn.titleLabel.font = [UIFont systemFontOfSize:17];
      [btn sizeToFit];
      btn.center = CGPointMake([UIScreen mainScreen].bounds.size.width/2, [UIScreen mainScreen].bounds.size.height/2);
      [btn addTarget:self action:@selector(hideWindown:) forControlEvents:UIControlEventTouchUpInside];
      [vc.view addSubview:btn];
    

    }

    return self;
    }

  • (void)hideWindown:(UIButton *)sender{
    [self resignKeyWindow];
    self.hidden = YES;
    }

  • (void)show
    {
    [self makeKeyWindow];
    self.hidden = NO;
    }

  • (void)applicationDidBecomeActive:(UIApplication *)application {

    [[PasswordInputwindow shareInstance] show];
    }

如果我們創(chuàng)建的UIWindow需要處理鍵盤事件,那么就需要合理的將其設(shè)置為keywindow。keywindow是被系統(tǒng)設(shè)計(jì)用來(lái)接受鍵盤和其他非觸摸事件的UIWindow。我們可以通過(guò)makeKeyWindow和makeKeyAndVisible方法來(lái)將自己創(chuàng)建的UIWindow實(shí)例設(shè)置為keywindow。支付寶客戶端的手勢(shì)解鎖功能,就是UIWindow的一個(gè)極好的應(yīng)用。


/***  文中的知識(shí)摘自“iOS開發(fā)進(jìn)階”   ****/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 二、使用UIWindow 1、簡(jiǎn)介在iOS App中,UIWindow是最頂層的界面內(nèi)容,我們使用UIWindow...
    南華coder閱讀 2,848評(píng)論 0 9
  • 開發(fā)中可能經(jīng)常會(huì)遇到需要在TableView底部添加工具條的情況,如果直接在TableVIewController...
    字節(jié)碼閱讀 367評(píng)論 0 0
  • UIView的功能 負(fù)責(zé)渲染區(qū)域的內(nèi)容,并且響應(yīng)該區(qū)域內(nèi)發(fā)生的觸摸事件 UIWindow 在iOS App中,UI...
    小蘑菇2閱讀 829評(píng)論 4 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • 我近期最想實(shí)現(xiàn)的一個(gè)愿望是:從德智體三方面培養(yǎng)兒子成為一個(gè)優(yōu)秀的人,希望他能當(dāng)上“三好”學(xué)生。懷著輕松愉悅的心情,...
    以娟閱讀 158評(píng)論 0 0

友情鏈接更多精彩內(nèi)容