官术网_书友最值得收藏!

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子類中都可以使用。

主站蜘蛛池模板: 北安市| 南部县| 密山市| 湘阴县| 庆元县| 宜阳县| 阳原县| 宕昌县| 平阴县| 静乐县| 福安市| 根河市| 察隅县| 抚宁县| 泽州县| 古丈县| 玉树县| 旬邑县| 侯马市| 龙门县| 连南| 达拉特旗| 江西省| 保康县| 博爱县| 衡东县| 河南省| 本溪市| 教育| 玉林市| 沂源县| 伊金霍洛旗| 靖安县| 三穗县| 保德县| 徐闻县| 周口市| 喀什市| 抚顺县| 昌图县| 乌拉特中旗|