天天看點

教你使用UIWindow實作視窗的切換

這兩天寫了一個手勢解鎖,該死的需求要求這個手勢解鎖頁面各種出現,畢竟人家這個用戶端酒20多個上司用用的,怕洩密就加了各種保密措施。

先來看下需求:

1.使用者注冊登入後跳轉設定手勢頁面(必須設定)。

2.app進入背景跳轉前台是進入手勢解鎖界面。

3.app内部分按鈕跳轉手勢界面。

開始我也想過使用UIWindow,後面因為沒有使用過就用push和模态視窗兩種方式去實作了一下,最後勉強實作了,但是在過程中真的是遇到各種問題,就包括我第二次進入用戶端進入手勢解鎖頁面時如果使用模态視窗的話,當手勢解鎖成功時就導緻了整個界面就是黑的,因為後面沒有界面了,還有出線了連續兩次push到同一控制器等原因,雖然實作了最後,不過我還是用window視窗切換實作了一次,下面我就分享下大緻實作的過程,其中也遇到了不少的坑。

首先就是實作了兩個window,一個主window,另外一個window我用來放了手勢解鎖頁面。

具體從ios幾開始,我也忘記了,現在的window必須指定根控制器,這個根控制器會幫你自動的管理這個window。

在初始化window和控制器之後我編譯運作了一下,發現還是實作不了,跑了很多遍終于發現了問題,就是視窗必須被強指針引用,不然一建立就直接被銷毀了。下面附上Demo:

self.window =[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  XYLoginViewController *LoginView = [[XYLoginViewController alloc] init];
  CustomNavigationController *navControl =[[CustomNavigationController alloc] initWithRootViewController:LoginView];
  self.window.rootViewController = navControl;

  LockController *LockView = [[LockController alloc] init];
  self.LockWindow =[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  self.LockWindow.backgroundColor = [UIColor yellowColor];
//設定高的優先級,保證視窗在最上方
  self.LockWindow.windowLevel = UIWindowLevelAlert + 2;
  self.LockWindow.rootViewController = LockView;

  if ([self isFirstTimeRun]) {
    //修改為不再是第一次運作
    [self setFirstTimeRun:NO];
//顯示主視窗
    self.window.hidden = NO;
    [self.window makeKeyAndVisible];
  } else {
    self.LockWindow.hidden = NO;
    [self.LockWindow makeKeyAndVisible];
  }      

視窗隐藏:

AppDelegate *myDelegate = [[UIApplication sharedApplication] delegate];
//隐藏解鎖視窗
                [myDelegate.LockWindow resignKeyWindow];
                myDelegate.LockWindow.hidden=YES;