視圖運行時交互模型
蘋果官網的一篇官方文檔。
有以下內容:
- 用戶觸控屏幕
- 硬件對用戶的觸控事件報告給UIKit框架
- UIKit框架打包觸控事件為一個UIEvent的類,然后把它分發到一個合適的view
- 你的view的響應事件代碼對這個事件作出響應
具體有:
?調整視圖或其子視圖的屬性變量(邊框、邊界、透明度等)。
?將視圖(或其子視圖)標識為需要修改布局。
?將視圖(或其子視圖)標識為布局需要重畫。
?將數據發生的變化通報給控制器。 - 如果一個view的坐標由于某些原因發生改變,UIKit框架會更新她的子view,但會遵循下面的規則:
?如果你為你的views設定了autoresizing的規則,那么UIKit會根據這些規則自動調整每一個view
?如果這些view實現了layoutSubviews的方法,UIKit框架會調用。(LayoutSubviews會調用設置好的constraints去設置你的view,還有子類能重寫這方法。) - 如果一個view 的任一部分需要被重繪,UIKit會請求這個view自行重繪。一般的視圖都會顯式的定義了drawRect:,UIKit會調用這個方法。
- 任何更新的視圖都會聯合剩余應用可視部分并且發送到圖形硬件顯式。
- 圖形硬件把修改的內容傳遞到屏幕上
基于上述的步驟說明可以看出,UIKit為您自己定制的視圖提供如下主要的結合點: 下面這些事件處理方法:
?touchesBegan:withEvent:
?touchesMoved:withEvent:
?touchesEnded:withEvent:
?touchesCancelled:withEvent:
- layoutSubviews方法
- drawRect:方法大多數定制視圖通過實現這些方法來得到自己期望的行為。您可能不需要重載所有方法,舉例來說,如果您實現的視圖是固定尺寸的,則可能不需要重載layoutSubviews方法。類似地,如果您實現的視圖只是顯示簡單的內容,比如文本或圖像,則通常可以通過簡單地嵌入UIImageView和UILabel對象作為子視圖來避免描畫。重要的是要記住,這些是主要的結合點,但不是全部。UIView類中有幾個方法的設計目的就是讓子類重載的