文章目錄
- 一.瞭解view的構成
- 二.Windows
- 三.Views
一.瞭解view的構成
1.view都有layer
2.每個程式都有個UIWindow,每個view都可以相互添加
3.subview是子視圖,superview是父視圖
4.view的繪製迴圈,在需要的時候才會繪製,ios會根據部署的view做一個,然後在可能的情況下都複用這個。你可以顯示的調用setNeedsDisplay或者setNeedsDisplayInRect方法來強制執行繪製。
5.修改一個view的幾何形狀不會自動使得view進行重繪,view的contentMode決定了重繪的方式,絕大部分的模式只是展開或者重新置放了而已,而不會重新建立一個新的view
6.修改frame,bounds;設定一個新的transform屬性都會觸發繪製迴圈。contentMode的屬性詳見"UIViewContentMode"。
7.展開視圖:contentStretch屬性,注意contentStretch和contentMode是針對layer.content進行縮放的,並不是針對view的subview,所以要搞
UIView* view=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 120, 40)]; view.contentStretch= CGRectMake(0.1,0.1, 0.9, 0.9); //不起作用 //view.backgroundColor=[[UIColor alloc]initWithPatternImage:[UIImage imageNamed:@"jiben_c"]]; view.layer.contents=(id )[UIImage imageNamed:@"jiben_c"].CGImage; view.frame=CGRectMake(0, 0, 200, 40);
8.內建動畫
屬性大致可以分為
形變:frame,bounds,center,transform
顏色:backgroundColor,alpha
內容展開:contentStretch
9.frame,bounds,center之間的關係
10.clipsToBounds參數
11.drawRect中可以通過CGContextGetCTM方法獲得CTM(current transformation matrix),使用Core Graphics方法來實行變換
12.view的transform如果不是identity的話,請忘記frame參數吧,用center和bound來定位以及確定大小
13.View的互動運行周期
a)使用者點擊
b)通知UIKit framework
c)UIKit framework把touch事件封裝成UIEvent發送給能歌響應的view
d)你的view可能做如下事情:修改view的參數改變其幾何形狀位置; 你調用setNeedsLayout方法去告訴系統你的view或者subviews需要布局的變換;調用setNeedsDisplay或者setNeedsDisplayInRect:方法去告訴系統需要重繪;提醒controller修改某些資料
e)如果view發生了幾何變形,按照如下規則變換。如果設定了自動變換規則,UIKit會根據規則進行調整。如果實現了layoutSubviews的話,這會調用該方法。
f)如果view被標記為需要重繪,則會調用實現了drawRect的方法
g)所有顯示的view都會被硬體所繪製
14.自訂view一些常用方法:
touchesBegan:withEvent: ;touchesMoved:withEvent: ; touchesEnded:withEvent: ; touchesCancelled:withEvent: ;
layoutSubview ; drawRect;
可以選擇性的實現一些方法,比如說你自己實現了手勢辨認,則不需要去覆蓋touch相關事件;如果你不會更改view的幾何形狀,則不用去覆蓋layoutSubview方法。
15.高效使用view的小貼士
a)不用每個view都配一個controller
b)最小化的使用自訂繪製
c)利用content mode
e)opaque為true
f)滾動時候繪製的最佳化,滾動時用縮圖替代,滾動停止再繪製精細的大圖
g)避免在已有的control中增加subviews,因為可能影響原來的功能
二.Windows
window比較少用,本文涉及的是一些window的基礎知識,用到的時候可以看下;比方說多螢幕編程,跟蹤Window的變化
三.Views
1.contentScaleFactor:相關介紹是在Drawing and Printing Guide for iOS 的"Supporting High-Resolution Screens"中,主要是繪圖時候的比例,因為繪圖的時候這個參數直接影響繪圖的大小。
2.exclusiveTouch:這個聲明是當view作為響應鏈第一響應者時,接收touch時間時,則在任何手指離開螢幕時不會響應其他任何view的響應,但是如果作為響應鏈一部分的話,則沒有效果,此外還發現,如果view1設定了這個屬性,view2沒有設定,先手指放在view2,然後另外一個手指放在view1,則view1不響應點擊,換句話說,這個屬性決定了view只能作為第一個響應點擊的view。
3.如何建立view(從nib建立,編程方式建立);修改subview的位置(addSubview,insertSubview,bringSubviewToFront,sendSubviewToBack,exchangeSubviewAtIndexWithSubviewAtIndex,removeFromSuperview)
4.添加一個subview到另一個view,父view和子view會調用如下方法,如果你自訂view中實現了相應方法
willMoveToSuperview,willMoveToWindow,willRemveSubview,didAddSubview,didMoveToSuperview,didMoveToWindow
5.window屬性是作為root view的父view,它的superview屬性為nil
6.座標轉換的方法(convertPoint:fromView:,convertRect:fromView:系列方法)
7.layout布局的觸發條件
a)view的bounds發生變化
b)裝置發生旋轉,通常是root view的bounds發生變化
c)view對應的layer發生變化
d)view 調用setNeedsLayout或者layoutIfNeeded
e)view的layer調用setNeedsLayout
8.自動布局:autoresizesSubviews為YES;autoresizingMask設定常量值;自動調整完後,還會調用layoutSubviews方法來使你有進一步的調整subview的機會。通常用來添加刪除view或者layer;對子類調用setNeedsDisplay,setNeesDisplayInRect方法,重繪subview.簡單舉例,比方說一個很大的scrollview中有個很大的圖片,往往不會一下載入,而是裁剪成很多小塊顯示,scrollView滑動時候,主動調用setNeedsDisplay,scrollview實現layoutSubview,並且在其中將超出螢幕的部分remove掉而繪製在螢幕部分的小圖片。
9.提高繪製代碼(drawRect),clearsContextBeforeDrawing設YES,opaque設YES
10.動畫相關可以看下我關於動畫的文章。