書名: iPhone UIKit詳解作者名: 王志剛 王中元 朱蕾編著本章字數(shù): 1462字更新時間: 2019-01-01 07:04:22
2.2 內(nèi)容管理
2.2.1 UIView的內(nèi)容
繪制原始的UIView時,需要繪制的可能只有背景色。但是當UIView中擁有一些內(nèi)容后,例如是UILable或UIImageView這樣的組成畫面的基本元素,那么該如何進行UIView的繪制呢?或者說如何控制這些內(nèi)容的顯示方式呢?本節(jié)中,將以擁有各種形式內(nèi)容的UIView來介紹如何控制具體內(nèi)容顯示方式的設(shè)置方法。
2.2.2 內(nèi)容的自動尺寸調(diào)整
在UIImageView中,根據(jù)邊框的大小,可以調(diào)整其中包含的圖片的顯示尺寸。默認為延伸到充滿整個邊框所占的空間,此時UIView的contentMode屬性為UIViewcontent ModeScaleToFill。contentMode屬性中可指定UIViewcontentMode類型的常量,通過設(shè)置不同常量值來進行內(nèi)容的尺寸調(diào)整或位置調(diào)整。如表2-3所示是contentMode屬性與內(nèi)容尺寸、位置的對應(yīng)情況。
表2-3 contentMode屬性與內(nèi)容尺寸、位置的對應(yīng)關(guān)系表
續(xù)表
續(xù)表
當內(nèi)容的繪制范圍超出了UIView的frame屬性標示的范圍時,系統(tǒng)將會在frame屬性標示的范圍外進行內(nèi)容繪制。如果想讓繪制范圍限制在UIView的邊框范圍內(nèi),需要事先將clipsToBounds屬性設(shè)置為YES。
2.2.3 指定內(nèi)容的伸縮區(qū)域
上一小節(jié)介紹了如何通過contentMode屬性來改變UIView中內(nèi)容的尺寸與位置。從iPhone OS 3.0開始追加了可以在內(nèi)容伸縮時指定具體可伸縮區(qū)域的屬性。這就是contentStretch屬性。在contentStretch屬性中以CGRect類型的數(shù)據(jù)來指定可伸縮的區(qū)域。此時,以x為橫坐標、y為縱坐標,以及分別以0.0到1.0范圍的數(shù)字指定寬、高的形式來進行設(shè)置。默認如下:
- origin.x = 0.0
- origin.y = 0.0
- size.width = 1.0
- size.height = 1.0
通過調(diào)整這些值,可以在調(diào)整內(nèi)容尺寸時改變伸縮的區(qū)域。如表2-4所示是設(shè)置值與內(nèi)容伸縮區(qū)域變化的對應(yīng)表。
表2-4 contentStretch屬性與伸縮區(qū)域的變化
續(xù)表
2.2.4 UIView適應(yīng)內(nèi)容
上一小節(jié)介紹了讓內(nèi)容根據(jù)UIView的大小進行尺寸調(diào)整。本節(jié)將介紹UIView本身如何根據(jù)內(nèi)容的大小進行調(diào)整的方法。此時使用的是sizeToFit方法。例如在UILabel中使用sizeToFit方法后,可以根據(jù)UILabel中保持的文本字符串大小自動調(diào)整UILabel的大小。UIButton的情況下,根據(jù)按鈕標題的大小自動調(diào)整按鈕的大小。下面是使用sizeToFit方法的實例代碼。
// 追加短標簽 UILabel* label1 = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease]; label1.backgroundColor = [UIColor blueColor]; label1.textColor = [UIColor whiteColor]; label1.text = @"短字符串”; [label1 sizeToFit]; [self.view addSubview:label1]; // 追加長標簽 UILabel* label2 = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease]; label2.backgroundColor = [UIColor blueColor]; label2.textColor = [UIColor whiteColor]; label2.text = @”長ーーーーーーーーーー字符串”; [label2 sizeToFit]; CGPoint newPoint = label2.center; newPoint.y += 50; label2.center = newPoint; [self.view addSubview:label2];
如圖2-7所示是實例代碼執(zhí)行的結(jié)果。

圖2-7 sizeToFit的執(zhí)行結(jié)果
下面嘗試修改一下sizeToFit方法中的處理。那么在自定義的UIView子類中該如何改變sizeToFit方法的處理呢?默認是無法進行任何改變的。但是sizeToFit方法中調(diào)用的sizeThatFits方法是在UIView中定義的,我們可以通過重寫sizeThatFits方法來修改sizeToFit方法的處理。
我們嘗試編寫一個擁有兩個UILabel的DoubleLabel(UIView子類),當此DoubleLabel的sizeToFit方法被調(diào)用時,想讓兩個UILabel的位置向里收緊一點。下面是sizeThatFits方法的實現(xiàn)代碼。
// 此類為UIView的子類 // 其中包含了label1_與label2_兩個UILabel -(CGSize)sizeThatFits:(CGSize)size { CGFloat x1,x2,y1,y2; // 將label1_與label2_中延伸的一方左側(cè)的坐標設(shè)置成x1 if(label1_.frame.origin.x < label2_.frame.origin.x){ x1 = label1_.frame.origin.x; } else { x1 = label2_.frame.origin.x; } // 將label1_與label2_中延伸的一方右側(cè)的坐標設(shè)置成x2 if(label1_.frame.origin.x + label1_.frame.size.width > label2_.frame.origin.x + label2_.frame.size.width) { x2 = label1_.frame.origin.x + label1_.frame.size.width; } else { x2 = label2_.frame.origin.x + label2_.frame.size.width; } // 將label1_與label2_中向上延伸的一方左側(cè)的坐標設(shè)置成y1 if(label1_.frame.origin.y < label2_.frame.origin.y){ y1 = label1_.frame.origin.y; } else { y1 = label2_.frame.origin.y; } // 將label1_與label2_中向下延伸的一方右側(cè)的坐標設(shè)置成y2 if(label1_.frame.origin.y + label1_.frame.size.height > label2_.frame.origin.y + label2_.frame.size.height) { y2 = label1_.frame.origin.y + label1_.frame.size.height; } else { y2 = label2_.frame.origin.y + label2_.frame.size.height; } // 新尺寸的設(shè)置 size.width = x2 - x1; size.height = y2 - y1; return size; }
2.2.5 Affine變換(擴大、縮小、反轉(zhuǎn)、平移)
UIView中提供了對內(nèi)容進行2次affine變換的功能。具體包括擴大、縮小、旋轉(zhuǎn)、反轉(zhuǎn)、平移等。進行affine變換時,要向UIView的transform屬性中設(shè)置CGAffineTransform的結(jié)構(gòu)體(見表2-5)。圖2-8中顯示了此結(jié)構(gòu)體的各個值在3×3 affine變換行列式中的具體位置。
表2-5 CGAffineTransform結(jié)構(gòu)體

圖2-8 3×3 affine變換行列式
設(shè)置CGAffineTransform結(jié)構(gòu)體的值時,需要有關(guān)affine變換行列式的知識。但是UIKit中同樣提供了不需要變換行列式的知識的相關(guān)方法。表2-6中就羅列了變形的種類與實現(xiàn)函數(shù)的列表。
表2-6 變形種類與CGAffineTransform函數(shù)對照表
將這些變形實際使用到UIImageView中的效果如圖2-9所示。

圖2-9 affine變換的使用效果
下面列舉一個將UIImageView旋轉(zhuǎn)90度的實例代碼。
imageView_.transform = CGAffineTransformMakeRotation(90 *(M_PI/ 180.0));
不僅可在UIImageView中使用,其他如UILabel及UIButton等UIView子類中都可以使用。
- 信號與系統(tǒng)習(xí)題指導(dǎo)
- PLC控制技術(shù)(西門子S7-200)
- Protel DXP 2004電路設(shè)計基礎(chǔ)與典型范例
- 現(xiàn)代移動通信網(wǎng)絡(luò)技術(shù)
- 5G商用:打造高速智能應(yīng)用場景
- 上門速查快修國產(chǎn)新型彩色電視機500例
- 雙色圖文詳解電感器及應(yīng)用電路
- 常用電子元器件識別/檢測/選用一讀通(第2版)
- 5G XR技術(shù)與應(yīng)用
- 物聯(lián)網(wǎng)-射頻識別(RFID)核心技術(shù)教程
- 實用電子電路一學(xué)就會
- 高處作業(yè) 通信線路專業(yè)篇
- 彩色電視機元器件檢測·選用·代換手冊
- Android 移動應(yīng)用開發(fā)
- 移動通信技術(shù)