天天看點

iOS開發UIView的屬性,父視圖和子視圖的層級操作,子視圖的自适應模式,外加一個定時器

轉載自:http://blog.csdn.net/weisubao/article/details/39582249

(1)UIView視圖frame的設定,四個參數,前2個确定位置,後2個确定大小。

(2)UIView的内容模式contentMode,和在UIImage中說的是一樣的,而且在UIImage中展示更容易了解。

(3)UIView最重要的就是父視圖和子視圖之間的關系,以及父視圖操作子視圖(增加一個子視圖,把一個子視圖放到最下面最上面、交換兩個子視圖的加載順序等等)

(4)還有一個重要的是,父視圖如果發生變化,子視圖怎麼自動調整布局:先讓父視圖允許子視圖幹這個事,即把父視圖的屬性autoresizesSubviews設定YES,然後再對對應的要自動調整布局的子視圖設定某一種自适應模式(有很多種模式,如變動自身寬和高來保證距離上、下、左、右不變或者保持自身高寬不變來變動距離上下左右邊距)。

(5)這裡還用到了一個定時器。這是在OC裡面講解到的,當做是複習。

[objc]  view plain copy

  1. #import "ViewController.h"  
  2. @interface ViewController ()  
  3. @end  
  4. @implementation ViewController  
  5. {  
  6.     UIView *view6;//為了改變它的大小,設為全局變量,這樣可以在其他方法中用  
  7. }  
  8. - (void)viewDidLoad {  
  9.     //執行個體化一個對象  
  10.     UIView *view1=[[UIView alloc]init];  
  11.     //設定位置和大小,位置要注意上面狀态欄占據了20,是以y要大于20,否則就被狀态欄遮住,在狀态欄文字下面,視覺不好看  
  12.     //因為是加載在self.view整個視圖裡面的,是以x和y位置就是相對于整個界面  
  13.     view1.frame=CGRectMake(10, 30, 100, 100);  
  14.     //CGRectMake是一個CGRect結構,這個結構裡面包括CGPoint結構的origin和CGSize結構的size,CGPoint結構有x和y,是以origin也是有x和y的,CGSize結構有width和height,是以size也有width和height。(隻是好奇為什麼CGPoint不用point而用origin)  
  15.     //是以通路frame裡面的四個資料就是  
  16.     NSLog(@"%.0f",view1.frame.origin.x);  
  17.     NSLog(@"%.0f",view1.frame.origin.y);  
  18.     NSLog(@"%.0f",view1.frame.size.width);  
  19.     NSLog(@"%.0f",view1.frame.size.width);  
  20.     //當然我們也可以得到view1的中心,中心嘛,是坐标,包括x和y的  
  21.     //在執行個體化一個結構時不需要加*,隻有執行個體化一個對象才需要加*  
  22.     CGPoint view1Point=view1.center;  
  23.     NSLog(@"%.0f,%.0f",view1Point.x,view1Point.y);  
  24.     //我們也可以獲得邊框屬性,是個CGRect,和frame的差別在于  
  25.     //邊框的四個值裡面x和y永遠都是0,我們隻能通過這個屬性得到寬和高  
  26.     CGRect view1Bounds=view1.bounds;  
  27.     NSLog(@"%.0f,%.0f,%.0f,%.0f",view1Bounds.origin.x,view1Bounds.origin.y,view1Bounds.size.width,view1Bounds.size.height);  
  28.     //設定标簽,标簽用處很大,比如在視圖中有多個view時,就需要這個來分辨是哪個  
  29.     view1.tag=1;  
  30.     //設定内容模式,這個在UIImageView中講解過【iOS開發-9】,而且用圖檔做示範部分縮放的效果更明顯容易了解  
  31.     view1.contentMode=UIViewContentModeCenter;  
  32.     view1.backgroundColor=[UIColor redColor];  
  33.     [self.view addSubview:view1];  
  34.     //增加一個視圖  
  35.     UIView *view2=[[UIView alloc]init];  
  36.     view2.frame=CGRectMake(10, 10, 40, 40);  
  37.     view2.backgroundColor=[UIColor greenColor];  
  38.     //我們把view2作為子視圖加到view1裡,此時,上面設定的x和y坐标位置,就是相對于view1的,即是相對于父視圖的位置  
  39.     [view1 addSubview:view2];  
  40.     //再增加一個視圖  
  41.     UIView *view3=[[UIView alloc]init];  
  42.     view3.frame=CGRectMake(50, 50, 40, 40);  
  43.     view3.backgroundColor=[UIColor blueColor];  
  44.     [view1 addSubview:view3];  
  45.     //此時,view2和view3的父視圖都是view1,可以嘗試改變父視圖背景顔色  
  46.     //一個視圖隻能有1個父視圖  
  47.     UIView *supView1=view2.superview;  
  48.     supView1.backgroundColor=[UIColor blackColor];  
  49.     //一個視圖可以有多個子視圖,是以子視圖這個屬性是個裝滿視圖的數組啊,看subviews後面有個s,而superview後面沒有s  
  50.     //利用for循環,把所有子視圖背景改成白色  
  51.     NSArray *subView1=view1.subviews;  
  52.     for (UIView *manyView1 in subView1) {  
  53.         manyView1.backgroundColor=[UIColor whiteColor];  
  54.     }  
  55.     //既然子視圖屬性subviews是一個數組,那誰在0,誰在1,順序如何?  
  56.     //結論:按照子視圖加載順序依次0,1,2...  
  57.     //試驗:取子視圖數組的第0個改變背景顔色發現是view2,就是我們第一個加到view1裡的那個  
  58.     UIView *whichview1=[subView1 objectAtIndex:0];  
  59.     whichview1.backgroundColor=[UIColor redColor];  
  60.     //我們再建立一個view4,把它加載到self.view  
  61.     UIView *view4=[[UIView alloc]init];  
  62.     view4.frame=CGRectMake(10, 180, 100, 100);  
  63.     view4.backgroundColor=[UIColor purpleColor];  
  64.     //自動剪裁打開,子視圖如果有超出view4的則被剪裁掉,預設是NO  
  65.     view4.clipsToBounds=YES;  
  66.     [self.view addSubview:view4];  
  67.     //我們再建立一個view5,加載到view4裡  
  68.     //結果是view5太大,超出view4範圍,如果要把超出的剪裁掉,需要在父視圖即view4中設定一下  
  69.     UIView *view5=[[UIView alloc]init];  
  70.     view5.frame=CGRectMake(10, 10, 200, 200);  
  71.     view5.backgroundColor=[UIColor orangeColor];  
  72.     //我們可以設定透明度,值越靠近1越不透明,越靠近0越透明  
  73.     view5.alpha=0.6;  
  74.     [view4 addSubview:view5];  
  75.     //我們再建立兩個視圖,一個子視圖,一個父視圖,來看看子視圖的布局  
  76.     //如果父視圖變動的話,子視圖如何變動?  
  77.     //(1)先把父視圖設定為允許子視圖變動;(2)再設定子視圖自動布局的方式  
  78.     //因為我們下面要用定時器改變這個父視圖大小,是以把它設定為全局變量,此處隻要初始化即可  
  79.     view6=[[UIView alloc]init];  
  80.     view6.frame=CGRectMake(30, 300, 100, 100);  
  81.     view6.backgroundColor=[UIColor blackColor];  
  82.     //(1)把子視圖自動調整設定為YES  
  83.     view6.autoresizesSubviews=YES;  
  84.     [self.view addSubview:view6];  
  85.     UIView *view7=[[UIView alloc]init];  
  86.     view7.frame=CGRectMake(10, 30, 80, 40);  
  87.     view7.backgroundColor=[UIColor whiteColor];  
  88.     //設定子視圖自動布局模式,有很多,可以用 | 來同時使用多個  
  89.     //UIViewAutoresizingFlexibleWidth-随着父視圖改變寬度  
  90.     //UIViewAutoresizingFlexibleHeight-随着父視圖改變高度  
  91.     //UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth-高和寬都随之改變,相當于和父視圖同比例縮放  
  92.     //UIViewAutoresizingFlexibleBottomMargin-舉例下面的margin随之改變,是以上面的和左邊的margin不動  
  93.     //UIViewAutoresizingFlexibleRightMargin-左、上margin不動  
  94.     //UIViewAutoresizingFlexibleLeftMargin-右、上margin不動  
  95.     //UIViewAutoresizingFlexibleTopMargin-左、下margin不動  
  96.     //UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin-上下居中  
  97.     //UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin-左右居中  
  98.     //UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin-相當于一直保持之前的上下左右邊距的比例,以上調整margin的幾個,自己本身大小都不變動  
  99.     view7.autoresizingMask=UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin;  
  100.     [view6 addSubview:view7];  
  101.     //設定一個定時器,不斷增加父視圖view6大小,不然我們看不出子視圖不斷調整布局的效果  
  102.     [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(autoResize1) userInfo:nil repeats:YES];  
  103.     //  
  104.     UIView *view8=[[UIView alloc]init];  
  105.     UIView *view9=[[UIView alloc]init];  
  106.     view8.frame=CGRectMake(30, 450, 100, 100);  
  107.     view9.frame=CGRectMake(30, 450, 80, 150);  
  108.     view8.backgroundColor=[UIColor blackColor];  
  109.     view9.backgroundColor=[UIColor redColor];  
  110.     //因為view8先加載,view9後加載,是以後加載的view9顯示在上面遮蓋view8  
  111.     [self.view addSubview:view8];  
  112.     [self.view addSubview:view9];  
  113.     //我們可以來操作視圖層之間的關系,把視圖放在上面還是下面,但這個自然是由父視圖來操作,view8和view9的父視圖就死self.view  
  114.     //把一個子視圖放到最下面  
  115.     [self.view sendSubviewToBack:view9];  
  116.     //把一個子視圖放到最上面  
  117.     [self.view bringSubviewToFront:view9];  
  118.     //用父視圖操作:插入一個視圖在指定順序,這個順序會影響覆寫,順序越靠前越在下面  
  119.     UIView *view10=[[UIView alloc]init];  
  120.     view10.frame=CGRectMake(30, 450, 120, 60);  
  121.     view10.backgroundColor=[UIColor greenColor];  
  122.     //由于我們這個self.view裡已經插入好多視圖了,是以view8和view9的順序是5和6,是以view10插在6,則在它們之間  
  123.     [self.view insertSubview:view10 atIndex:6];  
  124.     //我們也可以指定插入在誰的下面,在view8下面,那就在最下面了  
  125.     [self.view insertSubview:view10 belowSubview:view8];  
  126.     //我們也可以指定插入在誰的上面,在view9上面,那就在最上面了  
  127.     [self.view insertSubview:view10 aboveSubview:view9];  
  128.     //我們也可以交換兩個視圖的位置,比如把5和7交換,也就是view8和view10  
  129.     [self.view exchangeSubviewAtIndex:5 withSubviewAtIndex:7];  
  130.     //我們改變視圖層的上下層後,其實子視圖數組裡面的0、1、2...配置設定順序也同步發生改變,這個在使用exchangeSubviewAtIndex時可知,因為它直接就是交換的數組順序,可用以下方法檢查一下  
  131.     NSArray *subView2=self.view.subviews;  
  132.     UIView *view11=[subView2 objectAtIndex:5];  
  133.     view11.backgroundColor=[UIColor purpleColor];  
  134.     [super viewDidLoad];  
  135.     // Do any additional setup after loading the view, typically from a nib.  
  136. }  
  137. //我們要改變父視圖view6的大小,需要獲得它,那就需要把它設定為全局變量  
  138. -(void)autoResize1{  
  139.     view6.frame=CGRectMake(view6.frame.origin.x, view6.frame.origin.y, view6.frame.size.width+5, view6.frame.size.height+5);  
  140. }  
  141. @end