解決iOS在退入背景時會拍取快照的方法

陳永政 2019/05/10 14:33:08
255
一、專案實例:
以下是我們在某人壽的案例中使用的解法:
 
一、在ViewDidLoad註冊以下事件:
         NSNotificationCenter . DefaultCenter .
        AddObserver(UIApplication.WillResignActiveNotification,
            WillResignActiveHandleAction);
    NSNotificationCenter.DefaultCenter.
        AddObserver(UIApplication.DidBecomeActiveNotification, 
            DidBecomeActiveHandleAction);
二、事件內容:
     private void WillResignActiveHandleAction(NSNotification obj)
    {
        _webView.Alpha = 0;
    }


    private void DidBecomeActiveHandleAction(NSNotification obj)
    {
        _webView.Alpha = 1;
    }

 
然後就沒了.......
 
二、處理原理及概念:
 
基本原理很簡單,就是在進入背景前
(但事實上是失去活性前,因為真的進入背景的事件, 會跑在失去活性之後,沒了活性基本上iOS就是罷工的..... .)
把要隱藏的畫面的透明度改成0(也就是變透明)
然後回前景前(一樣事實上是取回活性後)把透明度改成1( 也就是不透明)
選擇調整透明度這個作法而不用蓋一塊View的做法是因為以下前 兩點,然後另外再補充兩點:
  1. 基本上iOS的所有畫面都一定有個底層的View,所以不管想變透明的是什麼畫面,這招都能用。
  2. 蓋一塊View很容易延伸出“不知道什麼時候要拿掉(因為回到APP不一定是開啟原畫面)”或“萬一要拿掉時沒有View反而會null Reference閃退”等問題
  3. 如果以上做法擔心變透明後不在原畫面回到APP(畢竟每個APP的流程都不同),導致進入該畫面時,該回復畫面事件沒被呼叫到(基本上不太可能發生),請在ViewWillAppear裡也設定讓要隱藏的畫面出現(透明度等於1)即可。
  4. 如果要改用iOS的“隱藏”屬性,而不是調整透明度,也完全沒有問題喔。
以上做法,可以自由搭配看客戶想要局部隱藏還是全部隱藏都可以。
 
三、補充Android的處理觀念、參考資料及應注意事項:
 
原理上,這個做法兩邊都是可以互通的
一樣在Android上確認進入背景或前景的時機點
(可以參考連結: https://www.jianshu.com/p/72c64766151c
然後一樣讓想要隱藏的部分隱藏或顯示就可以了
 
但這邊提醒一點,Android的隱藏有“invisible( 不顯示)”和“gone(消失)”兩種
不建議使用gone,因為會讓版面配置出現變化, 容易讓客戶覺得是跑版。
陳永政