IOS開發學習筆記(五)

+應用生命周期(5種狀態)

  • 未運行(Not Running):在設備打開的狀態下,只有遇到下面三種情況的時候才返回返回該狀態;* 應用的plist.info包含UIApplicationExistsOnSuspend(并且設值為YES);應用之前被掛起且系統需要清除一些內存;應用在運行過程中崩潰;
    不活躍(Inactive):應用僅在其他狀態間臨時過渡階段處于不活躍狀態。應用右在任意時間內處于不活躍狀態的唯一前提是,用戶正在處理系統提示(如通話或短信)或用戶鎖定了屏幕。這基本上是一種中間過渡狀態。向活躍狀態過渡;

  • 活躍(Active):應用在屏幕顯示時的正常運行狀態,可接收用戶輸入并更新顯示;

  • 后臺(Background):在此狀態,應用獲得了一些時間來執行一些代碼,但無法直接訪問屏幕或獲取任何用戶輸入。在用戶按下Home鍵后不久就會進行此狀態,大部分會迅速進入掛起狀態。需要在后臺執行各種操作的應用會一直牌此狀態,直到被再次激活;

  • 掛起(Suspended):掛起的應用被凍結執行;普通應用在處于后臺后不久就會轉變為此狀態。應用在活躍之前所有內存將原封不動的得以保留;若用戶切換回活躍狀態,將恢復到之前的狀態。若系統需要為當前活躍的應用提供更多內存,任何掛起的應用都可能被終結(并返回到未運行狀態)。
    點擊HOME鍵后的生命周期方法:通過工程屬性文件(info.plist)中的Application does not run in background的值(對應的鍵是UIApplicationExitsOnSuspend)來決定在按下home鍵后app是否在后臺運行;

對應的生命周期方法及通知:
—>通知:UIApplicationDidFinishLaunchingNotification:
方法:didFinishLaunchingWithOptions:
—>通知:UIApplicationDidBecomeActiveNotification:
方法:applicationDidBecomeActive:

—>通知:UIApplicationWillResignActiveNotification:
方法:applicationWillResignActive::

—>通知:UIApplicationDidEnterBackgroundNotification:
方法:applicationDidEnterBackground:

—>通知:UIApplicationWillEnterForegroundNotification:
方法:applicationWillEnterForeground:

—>通知:UIApplicationWillTerminateNotification:
方法:applicationWillTerminate:

其他說明:

【應用處于掛起狀態所占用的資源越少,該應用被ios終止的風險就越低。通過從內存中清理那些易于創建的資源,可增加應用駐留內存的機會,也要加快應用重啟速度】
applicationWillEnterForeground:從不活躍切換到后臺狀態所執行的任何操作。(可從這里重建持久網絡連接);
從不活躍到后臺,只有5秒時候來做保存操作;

- (void)applicationDidEnterBackground
{
    NSLog(@"VC: %@", NSStringFromSelector(_cmd));
    UIApplication *app = [UIApplication sharedApplication];
    //用一個系統標識符來保存進入后臺要執行的操作,以供后續使用
    __block UIBackgroundTaskIdentifier taskId;
    taskId = [app beginBackgroundTaskWithExpirationHandler:^{
        //該方法是告訴系統需要更多時間來完成某件事情,并承諾在完成后通知系統;若系統認為我們運行的太長了并決定停止運行就可以調用該block下的程序
        NSLog(@"Background task ran out of time and was terminated.");
        //運行完成后告訴系統可以進入后臺,但這里的taskId一定要和前面定義的taskId匹配。
        [app endBackgroundTask:taskId];
    }];
    //由于系統可能不會分配時間以做操作,一般可建立多個后臺任務,并為每個任務請求一個標識符,并允許每項任務在后臺隊列是繼續運行。
    if (taskId == UIBackgroundTaskInvalid) {
        //表示系統沒有為提供任何多余的時間,在這種情況下可嘗試完成必須完成的操作中最快的部分并希望能在應用終止前完成
        NSLog(@"Failed to start background task!");
        return;
    }

+手勢操作

Cocoa Touch沒有公開任何代表手勢的類或結構;手勢通過一系列事件在系統內部傳遞信息。(UIGestureRecognizer)類及其各種子類封裝了大量手勢功能。
響應者鏈
(類似android的事件傳遞),UIResponder—>UIView—>UIControl—>UIViewController;
視圖或控件是第一個響應者,若不處理該事件則向上傳遞,若已處理則消費。若都沒有處理最后傳遞到UIApplication,若UIApplication也沒有處理,則傳遞到UIApplicaitonDelegate;
4個手勢通知方法:

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //touches中對象數確定當前按壓屏幕的手指數量;touches中的每個對象都是一個UITouch事件
    //取出任意一個事件對象通過tapCount返回當前UITouch事件輕點屏幕的次數;
   NSInteger numTaps = [[touches anyObject] tapCount];
    //若numTouches為2表示兩個手指輕點了屏幕一次;若每個touch的tapCount都為2,就表示兩個手指進行了雙擊操作。
    NSUInteger numTouches = [touches count];
    //touches中的所有對象都可能實現該方法的視圖或視圖控制器的方法。
    //通過事件也可獲取 一個子集,但它僅擁有特殊視圖中觸摸的touches;
    NSSet *myTouchs = [event touchesForView:self.view];
}
-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{}
-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{}
-(void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{};//該方法是諸如來電打斷觸摸方法時會調用;
  • 監聽幾個手指滑動使用UISwipeGestureRecognizer
  • 監聽單擊,雙擊,三擊等點擊方法,使用UITapGestureRecognizer
  • 監聽捏合使用UIPinchGestureRecognizer;(連續手勢識別器)doPinch:
  • 監聽旋轉手勢使用UIRotationGestureRecognizer;doRotation:
  • 監聽搖動或拖拽手勢UIPanGestureRecognizer
  • 監聽長按UILongPressGestureRecognizer
  • 自定義手勢:實現UIGestureRecognizer并重寫四個touch方法即可;

博客地址:IOS開發學習筆記(五)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容