- 版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載习寸。
1.簡單的創(chuàng)建一個(gè)UIView.
CGRect viewRect = CGRectMake(10, 10, 100, 100);
UIView* myView = [[UIView alloc] initWithFrame:viewRect]; ```
>2.當(dāng)創(chuàng)建一個(gè)view 之后胶惰,給其屬性autoresizingMask設(shè)置一個(gè)恰當(dāng)?shù)闹凳呛苤匾模藢傩阅軌虼_保view 正確的調(diào)整自己的大小霞溪。view resizing主要發(fā)生在應(yīng)用程序的界面方向發(fā)生變化孵滞,也可能其他的原因,例如setNeedsLayout方法的調(diào)用將強(qiáng)迫view去更新自己的layout威鹿。
>3.當(dāng)view第一次顯示剃斧,或者由于layout的改變view的部分或者全部變的可見時(shí)轨香,系統(tǒng)會(huì)要求view去draw (繪制)自己的內(nèi)容忽你。對于一般的view(沒有使用OpenGL ES),系統(tǒng)調(diào)用view的 drawRect:方法。我們實(shí)現(xiàn)此方法時(shí)有責(zé)任在當(dāng)前圖形的上細(xì)紋中繪制view的內(nèi)容臂容。此方法系統(tǒng)自動(dòng)的調(diào)用科雳,我們不能自己調(diào)用。
當(dāng)view的實(shí)際內(nèi)容發(fā)生改變時(shí)脓杉,我們有責(zé)任通知系統(tǒng)去重新繪制糟秘。我們應(yīng)該調(diào)用view的setNeedsDisplay或者setNeedsDisplayInRect:方法,此方法讓系統(tǒng)知道在下一個(gè)drawing cycle 更新view球散。
>4.view中下列屬性的改變可以用一個(gè)動(dòng)畫來過度尿赚。` frame,bounds蕉堰,center凌净,transform,alpha屋讶,backgroundColor冰寻,contentStretch`。
>5.用戶界面的操作必須在主線程中皿渗。
>6.雖然有很多好的理由讓我們?nèi)憊iew的子類斩芭,我們推薦僅當(dāng)基本的view不能提供所需的功能時(shí)轻腺,在去寫子類,因?yàn)樽宇惖膶?shí)現(xiàn)需要去做更多的工作划乖,并去調(diào)增其性能贬养。
當(dāng)我們?nèi)慤IView的子類時(shí),應(yīng)該去重寫一些方法迁筛。
初始化:
`
initWithFrame——推薦去實(shí)現(xiàn)此方法煤蚌,除了它,我們也可以實(shí)現(xiàn)一些其他的自定義初始化方法细卧。
initWithCoder——當(dāng)從IB nib file中l(wèi)oad view并且需要自定義初始化時(shí)尉桩,實(shí)現(xiàn)此方法。
Drawing and printing:
drawRect——實(shí)現(xiàn)此方法贪庙,當(dāng)view 繪制自定義內(nèi)容蜘犁。如果view沒有任何的自定義繪制,避免重寫此方法止邮。
Layout:
sizeThatFits——如果想要view有不同的缺省的size(在resizing 操作時(shí))这橙,應(yīng)該實(shí)現(xiàn)此方法。
layoutSubviews——如果需要更精確的控制subviews的布局而不是依靠提供的autoresizing行為导披,實(shí)現(xiàn)此屈扎。
`
>在寫UIView子類時(shí),考慮下列屬性或者行為能不能提供相同的效果撩匕。
```swift
(1) 給屬性autoresizingMask設(shè)置值鹰晨。當(dāng)superview的frame發(fā)生改變時(shí),此屬性可以提供一個(gè)自動(dòng)的布局行為止毕。
(2)設(shè)置屬性contentMode的值模蜡。此屬性決定view content的布局行為。該屬性還影響到content怎么去縮放去適應(yīng)view扁凛,以及是否cache 或者redrawn忍疾。
(3)設(shè)置屬性contentStretch。
(4)設(shè)置屬性hidden或者alpha谨朝。
(5)設(shè)置backgroundColor屬性卤妒。
(6)添加subviews。除了用drawRect去繪制內(nèi)容字币,嵌入image或者label也可以则披。
(7)添加手勢。
(8)使用內(nèi)置的動(dòng)畫支持纬朝。
(9)使用一個(gè)image做為view 的背景收叶。```
#####下面是UIView方法的一些簡要說明:
>7.初始化view 對象
(1)`(id)initWithFrame:(CGRect)aRect`
初始化并返回一個(gè)新的收集的view 對象用具體的區(qū)域。如果用程序的方法創(chuàng)建一個(gè)view 對象共苛,此方法是UIView對象的designated initalizer方法判没。子類可以覆蓋此方法去進(jìn)行一些自定義的初始化但是在方法實(shí)現(xiàn)的開始處一定要調(diào)用super方法蜓萄。如果使用IB設(shè)計(jì)interface,則此方法不會(huì)調(diào)用澄峰,會(huì)從nib file中加載嫉沽。對象從nib file重新初始化會(huì)調(diào)用initWithCoder方法,此方法會(huì)修改view 的屬性使其與在nib file中存儲(chǔ)的屬性像匹配俏竞。
>8.配置view的表現(xiàn)
(1)backgroundColor(缺省是一個(gè)透明的背景顏色)绸硕, hidden,clipsToBounds不用再說了魂毁。
hidden設(shè)置成YES之后玻佩,view 也不在接收event,但是它仍然在superview的subviews列表中席楚。隱藏一個(gè)view會(huì)隱藏它的子views咬崔。如果view是當(dāng)前窗口的第一響應(yīng)者,則隱藏它會(huì)導(dǎo)致下一個(gè)view變成新的第一響應(yīng)者烦秩。
>(2)alpha:當(dāng)值為0.0時(shí)垮斯,view是完全透明的,當(dāng)值為1.0時(shí)只祠,view是完全不透明的兜蠕。此值只影響當(dāng)前view,不影響嵌入的子view抛寝。
>(3)opaque:一個(gè)boolean值確定view是否不透明熊杨。默認(rèn)是YES。如果一個(gè)view整個(gè)或者部分是透明的墩剖,但是此值設(shè)置為YES猴凹,結(jié)果將是不可預(yù)測的夷狰。應(yīng)該設(shè)置此值為NO如果view部分或者全部透明岭皂。
>(4)clearsContextBeforeDrawing:默認(rèn)為YES,在一些情況下設(shè)置成NO沼头,可以提高性能爷绘,再此就不再說了。
>(5)layerClass和layer跟Core Animation layer有關(guān)进倍。
>9.配置與事件相關(guān)的行為土至。
(1)execlusiveTouch:設(shè)置成YES能阻止觸摸事件的傳遞在同一個(gè)窗口中,默認(rèn)為NO猾昆。
>10.frame 陶因,center, bounds垂蜗,transform
(1)frame楷扬,相對于父視圖解幽。設(shè)置此值會(huì)改變center屬性的point和bounds屬性的size。
改變frame會(huì)自動(dòng)的去redisplay view烘苹,但不掉用drawRect:方法躲株;如果想讓frame改變的時(shí)候調(diào)用drawRect方法,則設(shè)置contentMode屬性為UIViewContentModeRedraw镣衡。
改變frame屬性的值可以動(dòng)畫霜定。如果transform屬性包含一個(gè) non-identity transform,則frame屬性的值是不確定的廊鸥,不應(yīng)該被修改望浩。在這種情況下,可以通過center屬性從新定義view的位置惰说,調(diào)整大小用bounds屬性曾雕。
>(2)bounds, center不再說了
>(3)transform (@property(nonatomic) CGAffineTransform transform)
具體指定transform助被,相對于bounds的center剖张。
缺省的transform是center屬性的值,或者anchorPoint屬性如果改變(不是很懂)
>10.配置調(diào)整大小的行為
(1)autoresizingMask
一個(gè)整數(shù)掩碼確定如何調(diào)整自己的大小當(dāng)superview的bounds發(fā)生改變時(shí)揩环。
當(dāng)一個(gè)view的bounds發(fā)生改變時(shí)搔弄,其會(huì)根據(jù)subviews各自的autoresizing mask去調(diào)整subviews的大小。缺省的值為UIViewAutoresizingNone丰滑,表示不應(yīng)該從新調(diào)整大小當(dāng)superview的bounds發(fā)生改變時(shí)顾犹。
>(2)autoresizesSubviews
一個(gè)boolean值指示當(dāng)其bounds改變時(shí),是否自動(dòng)的調(diào)整subviews的大小褒墨。缺省為YES炫刷。
>(3)contentMode:一個(gè)標(biāo)記決定當(dāng)bounds改變時(shí),怎么去布局它的內(nèi)容郁妈。
此屬性指示當(dāng)view bounds改變時(shí)浑玛,怎么調(diào)整view layer 緩存的bitmap(位圖)。此屬性經(jīng)常用來去實(shí)現(xiàn)調(diào)整大小的控制噩咪,通常與contentStretch屬性聯(lián)系在一起顾彰。
>(4)contentStretch(CGRect)
此矩形定義了一個(gè)view可拉伸和不可拉伸的區(qū)域。
可以使用此屬性去控制當(dāng)一個(gè)view大小調(diào)整時(shí)胃碾,view 的content怎么去拉伸去填充其邊界涨享。
此值必須在0.0到1.0范圍呢。缺省的為origin(0.0仆百,0.0)厕隧,size(1.0,1.0)。(不是很懂)
>(5)sizeThatFits:
詢問view去計(jì)算和返回最適合subviews的大小吁讨。
缺省是放回view bounds矩形的大小帖族。子類可以去覆蓋此方法。例如UISwitch對象返回一個(gè)固定大小的size去展示一個(gè)標(biāo)準(zhǔn)大小的switch view挡爵。UIImageView對象返回的大小和當(dāng)前顯示的image大小相同竖般。
>(6)sizeToFit:
調(diào)整并移動(dòng)view的大小使其剛好包含子視圖。
不要去覆蓋此方法茶鹃,如果想改變涣雕,覆蓋sizeTahtFits:方法。
>11.lay out subviews
(1)- (void)layoutSubviews
此方法的缺省實(shí)現(xiàn)是空闭翩。子類可以去重寫此方法當(dāng)需要更精確的subviews布局挣郭。當(dāng)subviews的autoresizes行為不能滿足要求時(shí)才去重寫此方法×圃希可以在實(shí)現(xiàn)中直接設(shè)置subviews的frame兑障。
不能直接調(diào)用此方法。如果想要在下一個(gè)drawing周期去更新view 布局蕉汪,應(yīng)該調(diào)用setNeedsLayout方法流译,如果想立即更新view的布局,應(yīng)該調(diào)用layoutIfNeeded方法者疤。
>(2)- (void)setNeedsLayout
view的當(dāng)前布局失效福澡,
觸發(fā)view在下一個(gè)update更新周期去更新layout。
>12.drawing 和updating view
(1)- (void)drawRect:(CGRect)rect
此方法的缺省實(shí)現(xiàn)什么都沒有驹马。子類使用原生的繪制技術(shù)(Core Graphics and UIKit)繪制內(nèi)容時(shí)應(yīng)該重寫此方法革砸,在方法里面寫出自己的drawing code。如果view設(shè)置自己的內(nèi)容用其他的方法糯累,則不需要去重寫此方法算利。舉例,如果view僅僅顯示一個(gè)背景顏色或者view用underlying layer對象去直接設(shè)置內(nèi)容時(shí)泳姐,不用去覆蓋此方法效拭。如果使用OpenGL ES也不應(yīng)該重寫此方法。
如果直接從UIView對象繼承仗岸,我們實(shí)現(xiàn)此方法不需要call super允耿。然而如果從其他的UIView對象繼承借笙,則應(yīng)該調(diào)用super扒怖。
當(dāng)view 第一次顯示或者當(dāng)view的可視的一部分無效時(shí),此方法會(huì)調(diào)用业稼。永遠(yuǎn)不要直接的調(diào)用此方法盗痒。調(diào)用setNeedsDisplay or setNeedsDisplayInRect: 方法會(huì)導(dǎo)致從新繪制。
>(2)- (void)setNeedsDisplay
調(diào)用此方法通知系統(tǒng)view 內(nèi)容需要重新繪制。view會(huì)在下一個(gè)drawing周期繪制俯邓。
如果你只是簡單的改變view的幾何形狀骡楼,view通常不會(huì)重新繪制。