0

我將執行一個特定的ViewController,其中每次我的應用程序進入前臺時彈出一次, - 需要一個訪問密碼。當應用程序回到前臺時控制應用程序快照

由於應用已經成熟,有點複雜,我寧願處理這個密碼,屏幕上其他風投的頂部顯示一個獨立的視圖控制器,通過以下方法從AppDelegate中調用,如applicationDidBecomeActive:

if (self.pwdVc==nil) 
     self.pwdVc = [mainStoryboard instantiateViewControllerWithIdentifier:@"passwordScreen"]; 
    [self.window.rootViewController presentViewController:self.pwdVc animated:NO completion:nil]; 

這種方法的問題似乎是:當應用程序進入前臺時,密碼ViewController尚未在屏幕上繪製,並且在短時間內實際應用程序屏幕顯示爲清晰。

即使我提前在applicationDidEnterBackground中觸發顯示密碼ViewController,但實際的屏幕重繪總是會在應用程序返回到前景時發生,從而不必要地顯示應用程序屏幕。

任何人都可以請建議最合適的方法讓這個密碼屏幕隱藏底層的ViewControllers沒有任何延遲?

將alpha設置從0.0切換到1.0的方法似乎也需要一些時間來顯示,並且到目前爲止還沒有工作。

謝謝!

回答

0

溶液由this topic來了,是基於把一個不透明的「屏幕鎖定」視圖上的任何其他視圖的頂部,並控制它通過其hidden財產在適當的AppDelegate方法!

所以:在didFinishLaunchingWithOptions

  1. 添加上在界面生成的任何其它視圖的頂視圖,並且最初設置其view.hidden=NO;
  2. 確保在applicationWillResignActive中設置view.hidden=NO,因爲此調用在發送應用到後臺和調用多任務屏幕時都會發生;
  3. 在「屏幕鎖定」視圖中放置一個按鈕,調用密碼正確時設置view.hidden=YES的方法。

可以選擇使用layer.zPosition來調整可見視圖的順序。

等voilà!謝謝你們!

1

使用此方法可將viewController放在最重要的位置。

+ (void)presentViewController:(UIViewController *)viewController animated:(BOOL)animated complete:(void (^)(void))callback 
{ 
    UIViewController *activeModalVC = [[[[UIApplication sharedApplication] delegate] window].rootViewController presentedViewController]; 
    if (activeModalVC) { 
     [activeModalVC presentViewController:viewController animated:animated completion:callback]; 
    } else { 
     [[[[UIApplication sharedApplication] delegate] window].rootViewController presentViewController:viewController animated:animated completion:callback]; 
    } 
} 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Making passwordView to load 
    self.pwdVc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] 
        instantiateViewControllerWithIdentifier:@"passwordScreen"]; 
    [self.pwdVc view]; 
} 

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    [AFAppDelegate presentViewController:self.pwdVc animated:NO complete:nil]; 
} 
+0

謝謝@ l0gg3r! 我嘗試了你的建議,但不幸的是,密碼視圖控制器仍然需要一段時間纔出現在頂部,只要應用程序回到前臺。 可能是我錯過了一些相關的東西? – frank 2014-09-23 07:42:11

+0

嘗試將該調用放入applicationDidBecomeActive中,並傳遞動畫屬性NO。我認爲這應該解決這個問題。 – l0gg3r 2014-09-23 07:45:47

+0

對不起,沒有運氣! – frank 2014-09-23 08:01:34

0

我發現another thread關於這一主題,從2013年開始,他說一個可以執行的指令採取屏幕快照之前在applicationDidEnterBackground從當前視圖中刪除相關數據。

實際上它不適用於我:在執行applicationDidEnterBackground甚至applicationWillResignActive之前,用於返回到前景的快照與屏幕內容一起拍攝。