iOS UIView非常用方法及屬性詳解

run.jpg
1.在調(diào)用視圖的drawRect:方法之前,UIKit 會自動對描畫環(huán)境進行配置贝或,使左上角成為坐標系統(tǒng)的原點,在這個環(huán)境中發(fā)生的 Quartz 調(diào)用都可以正確地在視圖中描畫锐秦。

2.視圖對象通過 frame咪奖、 bounds、和 center 屬 性聲明來跟蹤自己的大小和位置酱床。frame 屬性包含一個矩形羊赵,即邊框矩形,用于指定視圖相對于其父視圖坐標系統(tǒng)的位置和大小扇谣。bounds 屬性也包含一個矩形昧捷,即邊界矩形闲昭,負責定義視圖相對于本地坐標系統(tǒng)的位置和大小。雖然邊界矩形的原點通常被設置為(0, 0)料身,但這并不是必須的汤纸。center 屬性包含邊框矩形的中心點。

3.當您在代碼中通過** initWithFrame:方法創(chuàng)建一個視圖對象時芹血,其frame** 屬性就會被設置贮泞。該方法同時也將bounds 矩形的原點初始化為(0.0, 0.0),大小則和視圖的邊框相同幔烛。然后center 屬性會被設置為邊框的中心點啃擦。缺省情況下,視圖的邊框并不會被父視圖的邊框裁剪饿悬。如果您希望讓一個視圖裁剪其子視圖令蛉,需要將其** clipsToBounds** 屬性設置為YES。

4 .**UIView 類中包含一個 transform 屬性聲明狡恬,您可以通過它來對整個視圖實行各種類型的平移珠叔、比例縮放、和變焦縮放效果弟劲。缺省情況下祷安,這個屬性的值是一個恒等變換,不會改變視圖的外觀兔乞。在加入變換之前汇鞭,首先要得到該屬性中存儲的 CGAffineTransform 結構,用相應的Core Graphics 函數(shù)實行變換庸追,然后再將修改后的變換結構重新賦值給視圖的transform **屬性霍骄。

5.視圖的 contentMode 屬性決定了邊界變化和縮放操作作用到視圖上產(chǎn)生的效果。缺省情況下淡溯,這個屬性的值被設置為 UIViewContentModeScaleToFill读整,意味著視圖內(nèi)容總是被縮放,以適應新的邊框尺寸血筑。

6.不同的** UIViewContentMode** 常量(比如** UIViewContentModeTop** 和
UIViewContentModeBottomRight)可以使當前的內(nèi)容在視圖的不同角落或沿著視圖的不同邊界顯示绘沉,還有一種模式可以將內(nèi)容顯示在視圖的中心。

7.當您希望在應用程序中實現(xiàn)尺寸可調(diào)整的控件時豺总,請務必考慮使用 內(nèi)容模式车伞。
內(nèi)容模式通常有助于避免視圖內(nèi)容的描畫,但是當您希望對縮放和尺寸調(diào)整過程中的視圖外觀進行特別的控制時喻喳,也可以使用 UIViewContentModeRedraw 模式

7.如果視圖的** autoresizesSubviews** 屬性聲明被設置為YES另玖,則其子視圖會根據(jù)
autoresizingMask 屬性的值自動進行尺寸調(diào)整。否則,應用程序就必須通過重載 layoutSubviews 方法來提供自己的實現(xiàn)谦去。

8.如果要使一個視圖和其父視圖左下角的相對位置保持不變慷丽,可以加入 UIViewAutoresizingFlexibleRightMargin和
UIViewAutoresizingFlexibleTopMargin
常量,并將結果賦值給 autoresizingMask 屬性鳄哭。當同一個軸向有多個部分被設置為可變時要糊,尺寸調(diào)整的裕量會被平均分配到各個部分上。

  • UIViewAutoresizingNone
    這個常量如果被設置妆丘,視圖將不進行自動尺寸調(diào)整锄俄。
  • UIViewAutoresizingFlexibleHeight
    這個常量如果被設置,視圖的高度將和父視圖的高度一起成比例變化勺拣。否則奶赠,視圖的高度將保持不變。
  • UIViewAutoresizingFlexibleWidth
    這個常量如果被設置药有,視圖的寬度將和父視圖的寬度一起成比例變化毅戈。否則,視圖的寬度將保持不變愤惰。
  • UIViewAutoresizingFlexibleLeftMargin
    這個常量如果被設置苇经,視圖的左邊界將隨著父視圖寬度的變化
    而按比例進行調(diào)整。否則宦言,視圖和其父視圖的左邊界的相對位
    置將保持不變塑陵。
  • UIViewAutoresizingFlexibleRightMargin
    這個常量如果被設置,視圖的右邊界將隨著父視圖寬度的變化
    而按比例進行調(diào)整蜡励。否則,視圖和其父視圖的右邊界的相對位
    置將保持不變阻桅。
  • UIViewAutoresizingFlexibleBottomMargin
    這個常量如果被設置凉倚,視圖的底邊界將隨著父視圖高度的變化
    而按比例進行調(diào)整。否則嫂沉,視圖和其父視圖的底邊界的相對位
    置將保持不變稽寒。
  • UIViewAutoresizingFlexibleTopMargin
    這個常量如果被設置,視圖的上邊界將隨著父視圖高度的變化
    而按比例進行調(diào)整趟章。否則杏糙,視圖和其父視圖的上邊界的相對位
    置將保持不變。

9.如果您通過 Interface Builder 配置視圖蚓土,則可以用Size 查看器的 Autosizing 控 制來設置每個視圖的自動尺寸調(diào)整行為宏侍。上圖中的靈活寬度及高度常量和Interface Builder 中位于同樣位置的彈簧具有同樣的行為,但是空白常量的行為則是正好相反蜀漆。換句話說谅河,如果要將靈活右空白的自動尺寸調(diào)整行為應用到Interface Builder 的某個視圖,必須使相應方向空間的 **Autosizing **控制為空,而不是放置一個支柱绷耍。

10.如果視圖的 autoresizesSubviews 屬性被設置為 NO吐限,則該視圖的直接子視圖的所有自動尺寸調(diào)整行為將被忽略。類似地褂始, 如果一個子視圖的自動尺寸調(diào)整掩碼被設置為UIViewAutoresizingNone诸典,則該子視圖的尺寸將不會被調(diào)整,因而其直接子視圖的尺寸也不會被調(diào)整崎苗。

11.視圖層次中的父-子關系可以幫助我們定義應用程序中負責處理觸摸事件的對象鏈

12.創(chuàng)建一個新的視圖對象時狐粱,需要為其分配內(nèi)存,并向該對象發(fā)送一個 initWithFrame:消息益缠,以對其進行初始化脑奠。舉例來說,如果您要創(chuàng)建一個新的 UIView 類的實例作為其它視圖的容器幅慌,則可以使用下面的代碼:

CGRect viewRect = CGRectMake(0, 0, 100, 100);
UIView* myView = [[UIView alloc]  initWithFrame:viewRect];

13.在iPhone 程序中宋欺,有兩個地方最常用于創(chuàng)建視圖和子視圖, 它們是應用程序委托對象的 applicationDidFinishLaunching:方法和視圖控制器的** loadView** 方法胰伍。

  • 調(diào)用父視圖的 addSubview:方法來添加視圖齿诞,該方法將一個視圖添加到子視圖列表的最后。
  • 調(diào)用父視圖的 insertSubview:方法可以在父視圖的子視圖列表中間插入視圖骂租。
  • 調(diào)用父視圖的** bringSubviewToFront: 祷杈、 sendSubviewToBack: 、或
    exchangeSubviewAtIndex:withSubviewAtIndex:**方法可以對父視圖的子視圖進行重新排序渗饮。使用這些方法比從父視圖中移除子視圖并再次插入要快一些但汞。
    調(diào)用子視圖(而不是父視圖)的 removeFromSuperview 方法可以將子視圖從父視圖中移除。

創(chuàng)建一個帶有視圖的窗口

- (void) applicationDidFinishLaunching:(UIApplication *)application {
// Create the window object and assign it to the
// window instance variable of the application delegate.
window = [[UIWindow alloc] initWithFrame:[[ UIScreen mainScreen]  bounds]];
window. backgroundColor = [UIColor whiteColor];
// Create a simple red square
CGRect redFrame = CGRectMake(10, 10, 100, 100);
UIView *redView = [[UIView alloc] initWithFrame:redFrame];
redView.backgroundColor = [UIColor redColor];
// Create a simple blue square
CGRect blueFrame = CGRectMake(10, 150, 100, 100);
UIView *blueView = [[UIView alloc] initWithFrame:blueFrame];
blueView.backgroundColor = [UIColor blueColor];
// Add the square views to the window
[window addSubview:redView];
[window addSubview:blueView];
// Once added to the window, release the views to avoid the
// extra retain count on each of them.
[redView release];
[blueView release];
// Show the window.
[window makeKeyAndVisible];
}

14.當您為某個視圖添加子視圖時互站,UIKit 會向相應的父子視圖發(fā)送幾個消息私蕾,通知它們當前發(fā)生的狀態(tài)變化。您可以在自己的定制視圖中對諸如willMoveToSuperview: 胡桃、willMoveToWindow: 踩叭、 willRemoveSubview: 、 didAddSubview: 翠胰、didMoveToSuperview 和 didMoveToWindow這樣的方法進行重載容贝,以便在事件發(fā)生的前后進行必要的處理,并根據(jù)發(fā)生的變化更新視圖的狀態(tài)信息之景。

15.在視圖層次建立之后斤富,您可以通過視圖的 superview 屬性來取得其父視圖,或者通過 subviews屬性取得視圖的子視圖锻狗。您也可以通過 isDescendantOfView:方法來判定一個視圖是否在其父視圖的視圖層中茂缚。一個視圖層次的根視圖沒有父視圖戏罢,因此其superview 屬性被設置為nil。對于當前被顯示在屏幕上的視圖脚囊,窗口對象通常是整個視圖層次的根視圖龟糕。

UIView 類定義了下面這些方法,用于在不同的視圖本地坐標系統(tǒng)之間進行坐標轉換:

convertPoint:fromView:
convertRect:fromView:
convertPoint:toView:
convertRect:toView:

UIWindow 的版本則使用窗口坐標系統(tǒng)悔耘。

convertPoint:fromWindow:
convertRect:fromWindow:
convertPoint:toWindow:
convertRect:toWindow:

16.UIView 類中包含一個 tag 屬性讲岁。借助這個屬性,您可以通過一個整數(shù)值來標識一個視圖對象衬以。您可以通過這個屬性來唯一標識視圖層次中的視圖缓艳,以及在運行時進行視圖的檢索(基于 tag 標識的檢索比您自行遍歷視圖層次要快)。 tag 屬性的缺省值為0看峻。您可以通過UIView 的 viewWithTag:方法來檢索標識過的視圖

17.動畫塊從調(diào)用UIView 的 beginAnimations:context:類方法開始阶淘,而以調(diào)用 commitAnimations類 方法作為結束。在這兩個調(diào)用之間互妓,您可以配置動畫的參數(shù)和改變希望實行動畫的屬性值溪窒。一旦調(diào)用commitAnimations 方法,UIKit 就會開始執(zhí)行動畫冯勉,即把給定屬性從當前值到新值的變化過程用動畫表現(xiàn)出來澈蚌。動畫塊可以被嵌套,但是在最外層的動畫塊提交之前灼狰,被嵌套的動畫不會被執(zhí)行宛瞄。

frame 視圖的邊框矩形,位于父視圖的坐標系中交胚。
bounds 視圖的邊界矩形份汗,位于視圖的坐標系中。
center 邊框的中心蝴簇,位于父視圖的坐標系中裸影。
transform 視圖上的轉換矩陣,相對于視圖邊界的中心军熏。
alpha 視圖的alpha 值,用于確定視圖的透明度卷扮。
  • setAnimationStartDate:方法來設置動畫在commitAnimations 方法返回之后的發(fā)生日期荡澎。缺省行為是使動畫立即在動畫線程中執(zhí)行。
  • setAnimationDelay:方法來設置實際發(fā)生動畫和commitAnimations 方法返回的時間點之間的間隔晤锹。
  • setAnimationDuration:方法來設置動畫持續(xù)的秒數(shù)摩幔。
  • setAnimationCurve:方法來設置動畫過程的相對速度,比如動畫可能在啟示階段逐漸加速鞭铆,而在結束階段逐漸減速或衡,或者整個過程都保持相同的速度焦影。
  • setAnimationRepeatCount:方法來設置動畫的重復次數(shù)。
  • 用** setAnimationRepeatAutoreverses:**方法來指定動畫在到達目標值時是否自動反向播放封断。您可以結合使用這個方法和 setAnimationRepeatCount:方法斯辰,使各個屬性在初始值和目標值之間平滑切換一段時間。

18.您可以通過UIViewsetAnimationDelegate: 類方法來設置委托坡疼, 并通過 setAnimationWillStartSelector: 和
setAnimationDidStopSelector:
方法來指定接收消息的選擇器方法彬呻。

消息處理方法的形式如下:

- (void)animationWillStart:(NSString *)animationID context:(void *)context;

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber*)finished context:(void*)context;

上面兩個方法的animationID 和context 參數(shù)和動畫塊開始時傳 beginAnimations:context:方法的參數(shù)相同:
animationID - 應用程序提供的字符串,用于標識一個動畫塊中的動畫柄瑰。
context - 也是應用程序提供的對象闸氮,用于向委托對象傳遞額外的信息。
setAnimationDidStopSelector:選擇器方法還有一個參數(shù)—即一個布爾值教沾。如果動畫順利完成蒲跨,沒有被其它動畫取消或停止,則該值為YES授翻。

19.任何時候或悲,當視圖的布局發(fā)生改變時,UIKit 會激活每個視圖的自動尺寸調(diào)整行為藏姐,然后調(diào)用各自的 layoutSubviews 方法隆箩,使您有機會進一步調(diào)整子視圖的幾何尺寸。

  • 您的應用程序調(diào)用視圖的** setNeedsLayout 或 layoutIfNeeded** 方法來強制進行布局羔杨。
  • 您的應用程序調(diào)用視圖背后的層對象的 setNeedsLayout 方法來強制進行布局捌臊。
  • 您也可以用 layoutSubviews 方法來調(diào)整作為子層鏈接到視圖層的定制 CALayer 對象;

20.有些時候,應用程序數(shù)據(jù)模型的變化會影響到相應的用戶界面兜材。為了反映這些變化理澎,您可以將相應的視圖標識為需要刷新(通過調(diào)用 setNeedsDisplay 或 setNeedsDisplayInRect:方法
您可以通過改變視圖的 hidden 屬性聲明來隱藏或顯示視圖

初始化一個視圖的子類

- (id) initWithFrame:(CGRect)aRect {
self = [super initWithFrame:aRect];
if (self) {
// setup the initial properties of
the view
...
}
return self;
}

21.在iPhone OS 中,裝載nib 的代碼并不通過 initWithFrame:方法來實例化新的視圖對象曙寡,而是通過NSCoding 協(xié)議定義的 initWithCoder:方法來進行糠爬。
drawRect:方法的一個簡單實現(xiàn),即在視圖邊界描畫一個10像素寬的紅色邊界举庶。由于UIKit 描畫操作的實現(xiàn)也是基于Quartz执隧,所以您可以像下面這樣混合使用不同的描畫調(diào)用來得到期望的結果。

- (void)drawRect:(CGRect)rect {
CGContextRef context =  UIGraphicsGetCurrentContext();
CGRect myFrame = self.bounds;
CGContextSetLineWidth(context, 10);
[[UIColor redColor] set];
UIRectFrame(myFrame); 
// 搗鼓來搗鼓去户侥,搞得復雜6屏稹!蕊唐!
}

處理觸摸事件的視圖通常需要實現(xiàn)下面的所有方法

touchesBegan:withEvent:
touchesMoved:withEvent:
touchesEnded:withEvent:
touchesCancelled:withEvent:

22.激活多點觸摸事件:** multipleTouchEnabled** 屬性聲明設置為YES屋摔。
您可以通過改變視圖的 userInteractionEnabled 屬性值來控制視圖是否可以對事件進行處理。還可以使用UIApplication 對象的 beginIgnoringInteractionEvents 和 endIgnoringInteractionEvents 方法

23.UIKit 會通過UIView 的 hitTest:withEvent:和 pointInside:withEvent:方法來確定觸摸事件是否發(fā)生在指定的視圖上替梨。


隨手點個喜歡 吧 ~

關注我

QQ -- iOS 交流群 :107548668

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逗爹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子臭猜,更是在濱河造成了極大的恐慌娇跟,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機箕别,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滞谢,“玉大人串稀,你說我怎么就攤上這事∈ㄑ睿” “怎么了母截?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長橄教。 經(jīng)常有香客問我清寇,道長,這世上最難降的妖魔是什么护蝶? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任华烟,我火速辦了婚禮,結果婚禮上持灰,老公的妹妹穿的比我還像新娘盔夜。我一直安慰自己,他們只是感情好堤魁,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布喂链。 她就那樣靜靜地躺著,像睡著了一般妥泉。 火紅的嫁衣襯著肌膚如雪椭微。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天盲链,我揣著相機與錄音蝇率,去河邊找鬼。 笑死刽沾,一個胖子當著我的面吹牛本慕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悠轩,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼攻泼!你這毒婦竟也來了火架?” 一聲冷哼從身側響起鉴象,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎何鸡,沒想到半個月后纺弊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡骡男,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年淆游,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隔盛。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡犹菱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吮炕,到底是詐尸還是另有隱情腊脱,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布龙亲,位于F島的核電站陕凹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鳄炉。R本人自食惡果不足惜杜耙,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拂盯。 院中可真熱鬧佑女,春花似錦、人聲如沸磕仅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽榕订。三九已至店茶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間劫恒,已是汗流浹背贩幻。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留两嘴,地道東北人丛楚。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像憔辫,于是被迫代替她去往敵國和親趣些。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容