IOS 應用視圖交互模型分析

作者:朱克鋒

郵箱:[email protected]

轉載請註明出處:http://blog.csdn.net/linux_zkf


任何時候,當用戶和您的程序界面進行交互、或者您的代碼以編程的方式進行某些修改時,UIKit內部都會發生一個複雜的事件序列。在事件序列的一些特定的點上,UIKit會調用您的視圖類,使它們有機會代表應用程序進行事件響應。理解這些調用點是很重要的,有助於理解您的視圖對象和系統在哪裏進行結合。
下面的步驟說明進一步刨析,解釋了序列的每個階段都發生了什麼,以及應用程序可能如何進行響應。
    1.    用戶觸擊屏幕。
    2.    硬件將觸擊事件報告給UIKit框架。
    3.    UIKit框架將觸擊信息封裝爲一個UIEvent對象,並派發給恰當的視圖。
    4.    視圖的事件處理方法可以通過下面的方式來響應事件:
    ▪調整視圖或其子視圖的屬性變量(邊框、邊界、透明度等)。
    ▪將視圖(或其子視圖)標識爲需要修改佈局。
    ▪將視圖(或其子視圖)標識爲佈局需要重畫。
    ▪將數據發生的變化通報給控制器。
    5.    當然,上述的哪些事情需要做及調用什麼方法來完成是由視圖來決定的。
    6.    如果視圖被標識爲需要重新佈局,UIKit就調用視圖的layoutSubviews方法。您可以在自己的定製視圖中重載這個方法,以便調整子視圖的尺寸和位置。舉例來說,如果一個視圖具有很大的滾動區域,就需要使用幾個子視圖來“平鋪”,而不是創建一個內存很可能裝不下的大視圖。在這個方法的實現中,視圖可以隱藏所有不需顯示在屏幕上的子視圖,或者在重新定位之後將它們用於顯示新的內容。作爲這個過程的一部分,視圖也可以將用於“平鋪”的子視圖標識爲需要重畫。
    7.    如果視圖的任何部分被標識爲需要重畫,UIKit就調用該視圖的drawRect:方法。UIKit只對那些需要重畫的視圖調用這個方法。在這個方法的實現中,所有視圖都應該儘可能快地重畫指定的區域,且都應該只重畫自己的內容,不應該描畫子視圖的內容。在這個調用點上,視圖不應該嘗試進一步改變其屬性或佈局。
    8.    所有更新過的視圖都和其它可視內容進行合成,然後發送給圖形硬件進行顯示。
    9.    圖形硬件將渲染完成的內容轉移到屏幕。
請注意:上述的更新模型主要適用於採納內置視圖和描畫技術的應用程序。如果您的應用程序使用OpenGL ES來描畫內容,則通常要配置一個全屏的視圖,然後直接在OpenGL的圖形上下文中進行描畫。您的視圖仍然需要處理觸碰事件,但不需要對子視圖進行佈局或者實現drawRect:方法。
基於上述的步驟說明可以看出,UIKit爲您自己定製的視圖提供如下主要的結合點:
    1.    下面這些事件處理方法:
    ▪f2     touchesBegan:withEvent:
    ▪f2     touchesMoved:withEvent:
    ▪f2     touchesEnded:withEvent:
    ▪f2     touchesCancelled:withEvent:
    2.    layoutSubviews方法
    3.    drawRect:方法
大多數定製視圖通過實現這些方法來得到自己期望的行爲。您可能不需要重載所有方法,舉例來說,如果您實現的視圖是固定尺寸的,則可能不需要重載layoutSubviews方法。類似地,如果您實現的視圖只是顯示簡單的內容,比如文本或圖像,則通常可以通過簡單地嵌入UIImageView和UILabel對象作爲子視圖來避免描畫。

重要的是要記住,這些是主要的結合點,但不是全部。UIView類中有幾個方法的設計目的就是讓子類重載的




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章