iOS不用AutoLayout也能實現自動佈局的類(1)----MyLinearLayout

衆所周知,對於IOS開發者來講,隨着手機屏幕的尺寸在增多,不可避免的也須要考慮適配的問題了。這個問題在IOS6之前咱們能夠經過autoresizingMask和frame進行組合來解決視圖伸縮、旋轉的適配,可是這個方案不完全仍是須要編寫不少的代碼來完成;而在IOS6之後推出了AutoLayout的解決方案,這個方案的實現和可操做性太過於複雜和繁瑣不只編寫的代碼特別多,就是在XIB上進行佈局約束也很麻煩和難以管理。因而乎有大牛就對AutoLayout進行了改造和精簡推出了一些簡化自動佈局的框架好比:android

Masonry庫,CocoaUI庫git

 

      我有幸的拜讀和簡單使用了一下這些庫,發現確實有一些好處,能夠簡化視圖佈局的處理。但使用起來仍是有一些麻煩,這些庫都是對IOS的AutoLayout進行封裝而已。所以自己若是不對自動佈局不很瞭解的話也很容易繞道複雜的約束衝突中去;IOS8後由於有了4.7寸,5.5寸的屏幕後推出了sizeClass來進行佈局.程序員

   那麼有了這些後爲何咱們仍是不能知足??還要提出MyLinearLayout解決方案?github

 

1.咱們的應用還要支持到6.0如下。編程

2.我是一個老程序員不想學習新的佈局語言。數組

3.AutoLayout,size Class語法過於晦澀並且很差控制,個人frame甚至沒法使用了,個人動畫特效也很差處理了。xcode

4.MyLinearLayout的方法和使用邏輯簡單,易用並且功能強大。app

5.支持國產原創的庫發展。框架

 

若是上述理由您沒有一條贊成的話那麼能夠關閉掉這篇文章了。ide

 

       對於視圖的佈局來講,android系統的解決方案相對來講仍是比較好的,對於android系統來講咱們基本上不須要設置視圖擺放的具體位置,所以通常也不須要設置視圖的絕對位置值和絕對大小值,而是經過wrap_content,match_parent來指定視圖自己的相對高度和寬度,同時經過LinearLayout, RelativeLayout,FrameLayout等佈局來決定裏面子視圖的排列和擺放的位置,經過weight,padding,margin,gravity等屬性來設置視圖尺寸比例和排列對齊以及間距方面的東西, 而對於IOS來講咱們之前編碼時對於視圖的佈局老是經過setFrame來實現,用這種方法進行編程的最大的問題是咱們必須在代碼中寫死不少位置的常量,並且還要本身進行計算高度和寬度以及邊距等等,通常屏幕尺寸不一樣還須要對不一樣的尺寸進行處理,一樣對於AutoLayout來講咱們須要在代碼裏面編寫大量的約束,形成的結果就是代碼複雜和難以理解,對於維護來講更加是個災難,而對於佈局的微調更加是一個災難。

      基於上面的各類因素以及參考,MyLinearLayout橫空出世了:https://github.com/youngsoft/MyLinearLayout 

 

     MyLinearLayout的實現充分參考了Android中的LinearLayout佈局,可是卻比LinearLayout更爲強大,他幾乎能夠實現AutoLayout的全部功能甚至其不具有的功能。MyLinearLayout是一個基於流式佈局的容器視圖,咱們只須要把子視圖添加到MyLinearLayout中,並設置一些簡單的約束參數那麼就能夠完成各類佈局的要求了,並且後續中只要子視圖的位置和大小進行變化都會觸發容器視圖裏面的子視圖進行從新佈局。

 

  我先簡單的對MyLinearLayout裏面的屬性和函數進行介紹,而後咱們再實現一些佈局的場景的代碼的實現。MyLinearLayout既能夠用於編碼實現有能夠用在XIB中使用,可是在XIB中使用時請把AutoLayout的支持去掉,由於MyLinearLayout不是基於自動佈局的。

 

在介紹MyLinearLayout以前,咱們先要對視圖擴展出一些屬性,這些屬性只用於MyLinearLayout中。我會在後面一一介紹這些屬性以及用法。

 

 

 

@interface UIView(LayoutExt)

 

//下面4個屬性用於指定視圖跟他相關視圖之間的間距,若是爲0則是沒有間距,若是>0 <1則是相對間距,是按父視圖的比例算的,好比父視圖是100,而左間距是0.1則值是10。若是大於等於1則是絕對間距

//通常當使用相對間距時主要用圖是子視圖的寬度和高度是固定的,只是邊距隨父視圖的大小而調整。

@property(nonatomic,assign)CGFloat topMargin;

@property(nonatomic,assign)CGFloat leftMargin;

@property(nonatomic,assign)CGFloat bottomMargin;

@property(nonatomic,assign)CGFloat rightMargin;

 

 

 

@property(nonatomic,assign)CGFloat centerXOffset;

@property(nonatomic,assign)CGFloat centerYOffset;

@property(nonatomic,assign)CGPoint centerOffset;

 

 

 

 

 

//設定視圖的高度在寬度是固定的狀況下根據內容的大小而浮動,若是內容沒法容納的話則自動拉昇視圖的高度,若是原始高度高於內容則會縮小視圖的高度。默認爲NO,這個屬性主要用UILabel,UITextView的多行的狀況。

@property(nonatomic,assign,getter=isFlexedHeight)BOOL flexedHeight;

 

 

@end

 
 

@interface UIView(LinearLayoutExtra)

 

//比重,指定自定的高度或者寬度在父視圖的比重。取值爲>=0 <=1,這個特性用於平均分配高寬度或者按比例分配高寬度

@property(nonatomic,assign)CGFloat weight;

 

@end

 

 

 

這些屬性只用在MyLinearLayout中和MyFrameLayout(框架佈局,請瀏覽個人另一篇文章)中才有意義。若是咱們在XIB中進行佈局的話咱們能夠在自定義數據設置界面指定這些屬性。

 

 

 

    接下來咱們在介紹MyLinearLayout的定義,對於流式佈局來講簡單點就是從上到下或者從左到右,所以咱們定義了垂直佈局和水平佈局兩種樣式。

 

 

//佈局排列的方向

typedefenum : NSUInteger {

    LVORIENTATION_VERT,

    LVORIENTATION_HORZ,

} LineViewOrientation;

 

以及MyLinearLayout的屬性:

 

@property(nonatomic,assign)LineViewOrientation orientation;

 

 

               orientation =  LVORIENTATION_VERT                                        orientation =  LVORIENTATION_HORZ   

 

 

 

 

                                                                                                        

   由於垂直佈局和水平佈局的實現都是同樣的,下面的例子我都將以垂直佈局進行舉例,同時在沒有特殊說明的狀況下我會把MyLinearLayout的背景設置爲灰色。

 

1、子視圖間距設置以及自動調整大小的屬性

 

 

 

 

      要實現上面的佈局須要鍵入下面的代碼:

 

[objc]  view plain copy
  1. MyLinearLayout *ll = [[MyLinearLayout alloc] initWithFrame:CGRectMake(0, 0, 100,200)];  
  2.   ll.backgroundColor = [UIColor grayColor];  
  3.   
  4.   ll.orientation = LVORIENTATION_VERT;  
  5.   ll.leftMargin = 10;  
  6.   ll.wrapContentHeight = wrapContentHeight;  
  7.     
  8.   
  9.   UIView *v1 = [UIView new];  
  10.   v1.backgroundColor = [UIColor redColor];  
  11.   [ll addSubview:v1];  
  12.   
  13.   v1.topMargin = 4;  
  14.   v1.leftMargin = 10;  
  15.   v1.width = 60;  
  16.   v1.height = 40;  
  17.     
  18.  /* [v1 makeLayout:^(MyMaker *make) { 
  19.       
  20.       make.top.equalTo(@4); 
  21.       make.left.equalTo(@10); 
  22.       make.width.equalTo(@60); 
  23.       make.height.equalTo(@40); 
  24.   }];*/  
  25.     
  26.     
  27.     
  28.   UIView *v2 = [UIView new];  
  29.   v2.backgroundColor = [UIColor greenColor];  
  30.   [ll addSubview:v2];  
  31.   
  32.   v2.topMargin = 6;  
  33.   v2.leftMargin = 20;  
  34.   v2.width = 40;  
  35.   v2.height = 60;  
  36.   
  37.     
  38.   //您也能夠不設置width,height而是直接設置frame的寬度和高度  
  39.   UIView *v3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 75, 30)];  
  40.   v3.backgroundColor = [UIColor blueColor];  
  41.   v3.topMargin = 3;  
  42.   v3.leftMargin = 15;  
  43.   v3.bottomMargin = 4;  
  44.     
  45.   [ll addSubview:v3];  
  46.     



 

 

上面的代碼中實現了垂直佈局的代碼,在這段代碼中咱們發現v1,v2,v3的frame中x,y值部分不須要指定和計算了,都默認設置爲0,而改用topMargin和bottomMargin,leftMargin和rightMargin來指定視圖之間的間距,這樣一個好處是當某個子視圖的高度變化時佈局會自動從新進行子視圖位置的排列,而不要手動進行調整。 同時能夠發現雖然MyLinearLayout的高度設置爲200,但實際高度確是147,這是怎麼回事呢? 這是由於MyLinearLayout中有兩個屬性:

 

 

//高寬是否由子視圖決定,這兩個屬性只對線性和相對佈局有效,框架佈局無效

@property(nonatomic,assign)BOOL wrapContentWidth;

@property(nonatomic,assign)BOOL wrapContentHeight;

 

 

  這兩個屬性表示佈局視圖的寬度和高度是由子視圖決定的,這個就像android的wrapContent同樣,對於垂直佈局來講默認wrapContentHeight設置爲YES,而對於水平佈局來講默認wrapContentWidth設置爲YES。固然你也能夠在垂直佈局中將wrapContentHeight設置爲NO。下面的例子就是:

 

[objc]  view plain copy
  1. -(void)loadView  
  2. {  
  3.       
  4.     MyLinearLayout *test1ll = [MyLinearLayout new];  
  5.     test1ll.orientation = LVORIENTATION_HORZ; //水平佈局  
  6.     test1ll.gravity = MGRAVITY_HORZ_CENTER;   //本視圖裏面的全部子視圖總體水平和垂直居中  
  7.     self.view = test1ll;  
  8.   
  9.       
  10.     //標尺視圖  
  11.     UIView *v = [UIView new];  
  12.     v.backgroundColor = [UIColor blackColor];  
  13.    v.width = 10;  
  14.    v.height = 200;  
  15.     [test1ll addSubview:v];  
  16.       
  17.     [test1ll addSubview:[self createView:NO]];  
  18.     [test1ll addSubview:[self createView:YES]];  
  19. }  
  20. -(UIView*)createView:(BOOL)wrapContentHeight  
  21. {  
  22.     MyLinearLayout *ll = [[MyLinearLayout alloc] initWithFrame:CGRectMake(0, 0, 100,200)];  
  23.     ll.backgroundColor = [UIColor grayColor];  
  24.   
  25.     ll.orientation = LVORIENTATION_VERT;  
  26.     ll.leftMargin = 10;  
  27.     ll.wrapContentHeight = wrapContentHeight;  
  28.       
  29.   
  30.     UIView *v1 = [UIView new];  
  31.     v1.backgroundColor = [UIColor redColor];  
  32.     [ll addSubview:v1];  
  33.   
  34.     v1.topMargin = 4;  
  35.     v1.leftMargin = 10;  
  36.     v1.width = 60;  
  37.     v1.height = 40;  
  38.       
  39.    /* [v1 makeLayout:^(MyMaker *make) { 
  40.         
  41.         make.top.equalTo(@4); 
  42.         make.left.equalTo(@10); 
  43.         make.width.equalTo(@60); 
  44.         make.height.equalTo(@40); 
  45.     }];*/  
  46.       
  47.       
  48.       
  49.     UIView *v2 = [UIView new];  
  50.     v2.backgroundColor = [UIColor greenColor];  
  51.     [ll addSubview:v2];  
  52.   
  53.     v2.topMargin = 6;  
  54.     v2.leftMargin = 20;  
  55.     v2.width = 40;  
  56.     v2.height = 60;  
  57.   
  58.       
  59.     //您也能夠不設置width,height而是直接設置frame的寬度和高度  
  60.     UIView *v3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 75, 30)];  
  61.     v3.backgroundColor = [UIColor blueColor];  
  62.     v3.topMargin = 3;  
  63.     v3.leftMargin = 15;  
  64.     v3.bottomMargin = 4;  
  65.       
  66.     [ll addSubview:v3];  
  67.       
  68.       
  69.     return ll;  
  70. }  


 

2、佈局裏面子視圖的隱藏顯示以及對UIScrollView的支持。

 

     有時候有一些場景中,當某個或者某幾個視圖隱藏時,咱們但願下面的視圖可以自動往上移動以便填補空白,而當某個視圖再次顯示時下面的視圖又再次往下移動,很幸運! MyLinearLayout是支持這種狀況的(視圖必須是MyLinearLayout的直接子視圖才能夠)。

 

 

另外由於咱們有wrapContentHeight屬性,所以咱們能夠把線性佈局放入到一個ScrollView中(這又有點像android中的scrollview的方式)。來實現ScrollView的contentSize值的自動高度的調整。

 

 

這段代碼以下:

 

[objc]  view plain copy
  1. -(void)loadView  
  2. {  
  3.     UIScrollView *scrollView = [UIScrollView new];  
  4.     self.view = scrollView;  
  5.       
  6.     MyLinearLayout *ll = [MyLinearLayout new];  
  7.     ll.backgroundColor = [UIColor grayColor];  
  8.       
  9.     ll.padding = UIEdgeInsetsMake(10, 10, 10, 10);  
  10.     ll.leftMargin = 0;  
  11.     ll.rightMargin = 0; //這裏設置線性佈局的左右邊距都是0表示線性佈局的寬度和scrollView保持一致  
  12.       
  13.     UILabel *label = [UILabel new];  
  14.     label.leftMargin = 0;  
  15.     label.rightMargin = 0;  
  16.     label.flexedHeight = YES;  //這個屬性會控制在固定寬度下自動調整視圖的高度。  
  17.     label.numberOfLines = 0;  
  18.     label.backgroundColor = [UIColor blueColor];  
  19.     label.text = @"這是一段能夠隱藏的字符串,點擊下面的按鈕就能夠實現文本的顯示和隱藏,同時能夠支持根據文字內容動態調整高度,這須要把flexedHeight設置爲YES";  
  20.     [ll addSubview:label];  
  21.       
  22.     UIButton *btn = [UIButton new];  
  23.     btn.leftMargin = 0;  
  24.     btn.rightMargin = 0;  
  25.     btn.height = 60;  
  26.     [btn setTitle:@"點擊按鈕顯示隱藏文本" forState:UIControlStateNormal];  
  27.     [btn addTarget:self action:@selector(handleLabelShow:) forControlEvents:UIControlEventTouchUpInside];  
  28.     [ll addSubview:btn];  
  29.       
  30.     UIView *bottomView = [UIView new];  
  31.     bottomView.backgroundColor = [UIColor greenColor];  
  32.     bottomView.leftMargin = 0;  
  33.     bottomView.rightMargin = 0;  
  34.     bottomView.height = 800;  
  35.     [ll addSubview:bottomView];  
  36.       
  37.       
  38.   
  39.       
  40.     [self.view addSubview:ll];  
  41.       
  42.       
  43. }  
  44.   
  45. -(void)handleLabelShow:(UIButton*)sender  
  46. {  
  47.       
  48.     UIView *supv = sender.superview;  
  49.     NSArray *arr = supv.subviews;  
  50.       
  51.     UILabel *lab = [arr objectAtIndex:0];  
  52.       
  53.     if (lab.isHidden)  
  54.         lab.hidden = NO;  
  55.     else  
  56.         lab.hidden = YES;  
  57. }  



 

 

從代碼中咱們能夠看出當咱們要隱藏和顯示某個子視圖時直接設置子視圖隱藏和取消隱藏而不須要再編碼來調整整個視圖的高度,不須要編碼來移動下面兄弟視圖的位置,不須要編碼來調整父UIScrollView的contentSize來調整高度,咱們還能夠看到UIScrollView下只須要添加一個佈局視圖,同時咱們還指定了佈局視圖的寬度和UIScrollView是保持一致的。同時咱們還看到了UILabel中使用了擴展屬性flexedHeight,這個屬性設置爲YES時,系統會在佈局時自動根據指定的寬度來調整本身的高度,從而多行顯示完全部的內容,這個屬性很是的強大。

 

 

3、佈局內視圖位置的停靠以及佈局的內部邊距設定以及子視圖大小的指定

    有時候咱們但願佈局裏面的全部子視圖的位置都是固定的,好比全部子視圖左對齊,或者居中對齊,或者居右對齊。這時候咱們就須要用到佈局中的以下屬性了:

 

 

 

@property(nonatomic,assign)MarignGravity gravity;

 

這個屬性用於指定佈局中的全部子視圖的停靠位置,一共有以下的定義:

 

 

 

    MGRAVITY_NONE   //不強制全部子視圖的停靠方案而是子視圖本身決定本身的停靠位置

    MGRAVITY_HORZ_LEFT  //水平居左停靠

    MGRAVITY_HORZ_CENTER  // 水平居中停靠

    MGRAVITY_HORZ_RIGHT   //水平居右停靠

    MGRAVITY_HORZ_FILL   //水平填充

    MGRAVITY_VERT_TOP    //垂直居頂停靠

    MGRAVITY_VERT_CENTER  //垂直居中停靠

    MGRAVITY_VERT_BOTTOM  //垂直居低停靠

    MGRAVITY_VERT_FILL   //垂直填充

    MGRAVITY_CENTER      //居中

    MGRAVITY_FILL       //填充

 

這些定義中當gravity爲MGRAVITY_NONE時則代表不使用停靠策略,也就是按子視圖自身的停靠策略,好比有一些場景中咱們但願全部的子視圖都左邊對齊,那麼咱們能夠設置佈局視圖的gravity的值爲:MGRAVITY_HORZ_LEFT。而有時候咱們又但願佈局中的部分子視圖左邊對齊,部分右邊對齊則咱們不須要設置佈局視圖的gravity值而是分別對每一個子視圖自行設定。

 

有時候咱們但願佈局裏面的全部子視圖都跟佈局保持必定的間距,這時候咱們就能夠用以下的屬性:

@property(nonatomic,assign)UIEdgeInsets padding; //用來描述裏面的子視圖的離本身的邊距,默認上下左右都是0

 

//這個是上面屬性的簡化設置版本。

@property(nonatomic,assign)CGFloat topPadding;

@property(nonatomic,assign)CGFloat leftPadding;

@property(nonatomic,assign)CGFloat bottomPadding;

@property(nonatomic,assign)CGFloat rightPadding;

 

padding屬性用來描述裏面的全部子視圖跟本身保持的邊界距離。

 

下面代碼顯示了垂直佈局中的左中右三種停靠方式,以及四周的邊距都設置爲5,這樣是否是進一步的簡化了編碼?

 

[objc]  view plain copy
  1. -(UIView*)createView:(MarignGravity)gravity padding:(UIEdgeInsets)padding  
  2. {  
  3.     //咱們能夠設置widthDime也能夠設置  
  4.     MyLinearLayout *ll = [[MyLinearLayout alloc] initWithFrame:CGRectMake(0, 0, 100,200)];  
  5.     ll.orientation = LVORIENTATION_VERT;  
  6.     ll.leftMargin = 10;  
  7.     ll.gravity = gravity;  
  8.     ll.padding = padding;  
  9.     ll.backgroundColor = [UIColor grayColor];  
  10.       
  11.     UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 60, 40)];  
  12.     v1.backgroundColor = [UIColor redColor];  
  13.     v1.topMargin = 4;  
  14.     [ll addSubview:v1];  
  15.       
  16.     UIView *v2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 60)];  
  17.     v2.backgroundColor = [UIColor greenColor];  
  18.     v2.topMargin = 6;  
  19.     [ll addSubview:v2];  
  20.       
  21.       
  22.     UIView *v3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 75, 30)];  
  23.     v3.backgroundColor = [UIColor blueColor];  
  24.     v3.topMargin = 3;  
  25.     v3.bottomMargin = 4;  
  26.     [ll addSubview:v3];  
  27.       
  28.     return ll;  
  29.       
  30. }  
  31.   
  32.   
  33.   
  34. -(void)loadView  
  35. {  
  36.       
  37.     MyLinearLayout *test1ll = [MyLinearLayout new];  
  38.     test1ll.orientation = LVORIENTATION_HORZ; //水平佈局  
  39.     test1ll.gravity = MGRAVITY_CENTER;   //本視圖裏面的全部子視圖總體水平居中停靠  
  40.     self.view = test1ll;  
  41.       
  42.     [test1ll addSubview:[self createView:MGRAVITY_HORZ_LEFT padding:UIEdgeInsetsMake(5, 5, 5, 5)]];  
  43.     [test1ll addSubview:[self createView:MGRAVITY_HORZ_CENTER padding:UIEdgeInsetsMake(5, 5, 5, 5)]];  
  44.     [test1ll addSubview:[self createView:MGRAVITY_HORZ_RIGHT padding:UIEdgeInsetsMake(5, 5, 5, 5)]];  
  45.       
  46. }  



 

 

上面的視圖中咱們能夠經過爲佈局視圖設置gravity的值來調整裏面全部子視圖的左右方向的停靠位置,一樣咱們也能夠經過設置佈局視圖的gravity的值來調整全部子視圖上下方向的停靠位置,見下面的圖片:

 

 

 

代碼以下:

 

 

[objc]  view plain copy
  1. -(UIView*)createView:(MarignGravity)gravity  
  2. {  
  3.     MyLinearLayout *ll = [[MyLinearLayout alloc] initWithFrame:CGRectMake(0, 0, 100,200)];  
  4.     ll.leftMargin = 10;  
  5.     ll.orientation = LVORIENTATION_VERT;  
  6.     ll.gravity = gravity;  
  7.     ll.backgroundColor = [UIColor grayColor];  
  8.       
  9.     UIView *v1 = [UIView new];  
  10.     v1.backgroundColor = [UIColor redColor];  
  11.     v1.topMargin = 4;  
  12.     v1.leftMargin = v1.rightMargin = 0;  
  13.     v1.height = 40;  
  14.     [ll addSubview:v1];  
  15.       
  16.     UIView *v2 = [UIView new];  
  17.     v2.backgroundColor = [UIColor greenColor];  
  18.     v2.topMargin = 6;  
  19.     v2.width = 40;  
  20.     v2.height = 60;  
  21.     [ll addSubview:v2];  
  22.       
  23.       
  24.     UIView *v3 = [UIView new];  
  25.     v3.backgroundColor = [UIColor blueColor];  
  26.       
  27.     v3.topMargin = 3;  
  28.     v3.bottomMargin = 4;  
  29.     v3.width = 75;  
  30.     v3.height = 30;  
  31.       
  32.     [ll addSubview:v3];  
  33.       
  34.     return ll;  
  35.       
  36.       
  37. }  
  38.   
  39. -(void)loadView  
  40. {  
  41.       
  42.     MyLinearLayout *test1ll = [MyLinearLayout new];  
  43.     test1ll.orientation = LVORIENTATION_HORZ; //水平佈局  
  44.     test1ll.gravity = MGRAVITY_CENTER;   //本視圖裏面的全部子視圖總體水平居中停靠  
  45.     self.view = test1ll;  
  46.       
  47.       
  48.     [test1ll addSubview:[self createView:MGRAVITY_VERT_TOP]];  
  49.     [test1ll addSubview:[self createView:MGRAVITY_VERT_CENTER]];  
  50.     [test1ll addSubview:[self createView:MGRAVITY_VERT_BOTTOM]];  
  51. }  



 

 

從上面兩段代碼中咱們能夠經過gravity的值來設置佈局視圖內的全部視圖的停靠方式,可是有的時候咱們不但願由佈局視圖來統一控制停靠的方向(對於垂直佈局的話是指左右方向,對於水平佈局的話是指上下方向),而是但願由子視圖自生來控制停靠的位置。這時候必需要將線性佈局的gravity設置爲MGRAVITY_NONE.

 

 

代碼以下:

 

 

[objc]  view plain copy
  1. -(void)loadView  
  2. {  
  3.     MyLinearLayout *ll = [MyLinearLayout new];  
  4.     ll.orientation = LVORIENTATION_VERT;  
  5.     ll.gravity = MGRAVITY_VERT_CENTER;  
  6.     ll.backgroundColor = [UIColor grayColor];  
  7.     self.view = ll;  
  8.       
  9.     //再也不須要指定y的偏移值了。  
  10.     UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 50)];  
  11.     v1.backgroundColor = [UIColor redColor];  
  12.   
  13.     v1.topMargin = 10;  
  14.     v1.leftMargin = 10;  
  15.     [ll addSubview:v1];  
  16.       
  17.     UIView *v2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];  
  18.     v2.backgroundColor = [UIColor greenColor];  
  19.     v2.topMargin = 10;  
  20.     v2.centerXOffset = 0;  //這裏是居中  
  21.       
  22.     [ll addSubview:v2];  
  23.       
  24.       
  25.     UIView *v3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 50)];  
  26.     v3.backgroundColor = [UIColor blueColor];  
  27.     v3.topMargin = 10;  
  28.     v3.rightMargin = 10;  
  29.     [ll addSubview:v3];  
  30.       
  31.     UIView *v4 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 50)];  
  32.     v4.backgroundColor = [UIColor yellowColor];  
  33.     v4.topMargin = 10;  
  34.     v4.bottomMargin = 10;  
  35.     v4.leftMargin = 5;  
  36.     v4.rightMargin = 5;  
  37.      [ll addSubview:v4];  
  38.       
  39.       
  40.   
  41.       
  42. }  



 

上面的四個子視圖中v1設置了leftMargin=10表示左邊邊距爲10, v2設置了centerXOffset = 0 表示水平居中, v3設置了rightMargin=10表示右邊邊距爲10, 而v4設置了leftMargin=5,rightMargin = 5則表示兩邊的邊距都是5,那麼v4的寬度就會動態的調整。所以有時候咱們想讓子視圖的寬度等於父視圖時則能夠設置以下:

 

v.leftMargin = 0;

v.rightMargin = 0;

 

 

 在佈局時,咱們能夠經過frame來設置子視圖的高度和寬度的絕對值,咱們能夠經過擴展屬性:

 

 

/*

 下面兩個屬性是上面widthDime,heightDime的equalTo設置NSNumber類型值的簡化版本,主要用在線性佈局和框架佈局裏面

 表示設置視圖的寬度和高度,須要注意的是設置這兩個值並非直接設置frame裏面的size的寬度和高度,而是設置的佈局的高度和寬度值。

 也就是說設置和獲取值並不必定是最終視圖在佈局時的真實高度和寬度

 

 v.width = 10    <=>   v.widthDime.equalTo(@10)

 

 */

@property(nonatomic,assign)CGFloat width;

@property(nonatomic,assign)CGFloat height;

 

來設置視圖的高度和寬度值,須要注意的是經過width,height設置的值並非frame設置的高度和寬度值,而是在佈局時纔會生效的高度值和寬度。

 

咱們也能夠經過同時設置leftMargin 和rightMargin的值來指定視圖的寬度值。但有時候咱們但願能有更增強大的功能,好比但願某個子視圖是佈局視圖寬度的50%或者80%或者但願比佈局視圖的寬度減小50等等。

 

這時候咱們經過frame或者經過設置width就不能實現了,可是咱們可使用高級的子視圖擴展屬性。

 

 

 

//尺寸,若是設置了尺寸則以設置尺寸優先,不然以視圖自身的frame的高寬爲基準

@property(nonatomic,readonly) MyLayoutDime *widthDime;

@property(nonatomic,readonly) MyLayoutDime *heightDime;

 

 

上面的width和height設置是這兩個屬性設置的簡化版本,咱們能夠看看MyLayoutDime的定義:

 

 

 

@interface MyLayoutDime :NSObject

 

//乘

-(MyLayoutDime* (^)(CGFloat val))multiply;

 

//加,用這個和equalTo的數組功能能夠實現均分子視圖寬度以及間隔的設定。

-(MyLayoutDime* (^)(CGFloat val))add;

 

 

//NSNumber, MyLayoutDime以及MyLayoutDime數組,數組的概念就是全部數組裏面的子視圖的尺寸平分父視圖的尺寸。

-(MyLayoutDime* (^)(id val))equalTo;

 

 

@end

 

 

高級的widthDime和heightDime一般用在相對佈局裏面,可是現行佈局也是支持。好比咱們但願子視圖的寬度和父視圖相等則:

 v.widthDime.equalTo(v.superView.widthDime)

 

若是咱們但願子視圖的寬度是父視圖的50%則

v.widthDime.equalTo(v.superView.widthDime).multiply(0.5)

 

而咱們但願子視圖的寬度比父視圖減小100則

 

v.widthDime.equalTo(v.superView.widthDime).add(-100)

 

咱們但願子視圖的寬度就是100則

 

v.widthDime.equalTo(@100)   <==>  v.width = 100

 

看以下佈局:

 

 

 

 

 

代碼以下:

 

[objc]  view plain copy
  1. -(void)loadView  
  2. {  
  3.           
  4.     MyLinearLayout *ll = [MyLinearLayout new];  
  5.     ll.orientation = LVORIENTATION_VERT;  
  6.     ll.gravity = MGRAVITY_VERT_CENTER;  
  7.     ll.backgroundColor = [UIColor grayColor];  
  8.     self.view = ll;  
  9.       
  10.     UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 50)];  
  11.     v1.backgroundColor = [UIColor redColor];  
  12.     v1.topMargin = 10;  
  13.     v1.leftMargin = v1.rightMargin = 0;  
  14.     [ll addSubview:v1];  
  15.       
  16.     UIView *v2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 50)];  
  17.     v2.backgroundColor = [UIColor greenColor];  
  18.     v2.topMargin = 10;  
  19.     v2.widthDime.equalTo(ll.widthDime).multiply(0.8);  //父視圖的寬度的0.8  
  20.     [ll addSubview:v2];  
  21.       
  22.       
  23.     UIView *v3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 50)];  
  24.     v3.backgroundColor = [UIColor blueColor];  
  25.     v3.topMargin = 10;  
  26.     v3.widthDime.equalTo(ll.widthDime).add(-20);  //父視圖的寬度-20  
  27.     [ll addSubview:v3];  
  28.       
  29.     UIView *v4 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 50)];  
  30.     v4.backgroundColor = [UIColor yellowColor];  
  31.     v4.topMargin = 10;  
  32.     v4.bottomMargin = 10;  
  33.     v4.leftMargin = 10;  
  34.     v4.rightMargin = 10;  
  35.     [ll addSubview:v4];  
  36.       
  37.   
  38.       
  39. }  

 

 

上面的代碼中咱們使用了視圖的高級擴展屬性widthDime, heightDime,這兩個一般用在相對佈局MyRelativeLayout的處理中。具體的介紹能夠看個人關於相對佈局的處理的文章。

 

 

 

4、終極武器1:子視圖的相對尺寸,以及佈局視圖的尺寸,複雜佈局的處理。

      在某些時候,咱們知道了佈局視圖的高度的狀況下,想平分裏面全部子視圖的高度,或者裏面的子視圖的高度咱們只須要指定相對值而不須要指定絕對值,若是咱們想在佈局視圖裏面增長2個視圖,其中一個視圖佔用佈局視圖的40%,而另一個視圖佔用60%。由於若是支持子視圖的相對高度的話,那麼當佈局視圖進行縮放或者進行旋轉時裏面的子視圖都會按照指定比例進行縮放,這時候咱們須要用到上面視圖的一個強大的擴展屬性:weight了:

 

 

@property(nonatomic,assign)CGFloat weight;

 

這個視圖的擴展屬性的設置的範圍是0到1表示子視圖自己在佈局視圖中所佔用的高度或者寬度的比例,下面咱們來實現一個自動佈局裏面一個最經典的需求:

 

  每一個視圖的間距都爲20,分爲上下2個部分,各佔用50%,上面的2個視圖各佔用50%。

 

 

            

 

 

 

 

[objc]  view plain copy
  1. -(void)loadView  
  2. {  
  3.     //線性佈局實現相對子視圖  
  4.     MyLinearLayout *ll = [MyLinearLayout new];  
  5.     //保證容器和視圖控制的視圖的大小進行伸縮調整。  
  6.     ll.orientation = LVORIENTATION_VERT;  
  7.     ll.padding = UIEdgeInsetsMake(20, 20, 20, 20);  
  8.     ll.backgroundColor = [UIColor grayColor];  
  9.       
  10.     MyLinearLayout *topll = MyLinearLayout.new;  
  11.     topll.orientation = LVORIENTATION_HORZ;  
  12.     topll.weight = 0.5;  
  13.     topll.leftMargin = topll.rightMargin = 0;  
  14.       
  15.     UIView *topLeft = UIView.new;  
  16.     topLeft.backgroundColor = [UIColor redColor];  
  17.     topLeft.weight = 0.5;  
  18.     topLeft.topMargin = topLeft.bottomMargin = 0;  
  19.     [topll addSubview:topLeft];  
  20.       
  21.     UIView *topRight = UIView.new;  
  22.     topRight.backgroundColor = [UIColor greenColor];  
  23.     topRight.weight = 0.5;  
  24.     topRight.topMargin = topRight.bottomMargin = 0;  
  25.     topRight.leftMargin = 20;  
  26.     [topll addSubview:topRight];  
  27.       
  28.     [ll addSubview:topll];  
  29.       
  30.       
  31.     UIView *bottom = UIView.new;  
  32.     bottom.backgroundColor = [UIColor blueColor];  
  33.     bottom.weight = 0.5;  
  34.     bottom.widthDime.equalTo(ll.widthDime);  
  35.     bottom.leftMargin = bottom.rightMargin = 0;  
  36.     bottom.topMargin = 20;  
  37.     [ll addSubview:bottom];  
  38.       
  39.       
  40.     self.view = ll;  
  41. }  



 

 

 

從上面的代碼能夠看出,其中沒有使用到任何絕對的位置和大小的數字,都是相對值,爲了支持複雜的佈局咱們使用了MyLinearLayout的嵌套的方式來解決問題。

 

經過爲子視圖的weight的指定咱們能夠很靈活的對佈局裏面的子視圖的高度進行設置,一個佈局中咱們能夠設置某些子視圖的絕對高度,也能夠設置另一些子視圖的weight。好比:

 

1.某個線性佈局有3個子視圖,而且頂部和底部的視圖的高度都是固定的,而中間的視圖則佔用佈局的剩餘高度則能夠以下設置:

 

 v1.frame  = CGRectMake(0,0,x, 30)

 v2.frame = CGRectZero

 v2.weight = 1.0

 v3.frame  = CGRectMake(0,0,x,50)

 

2.某個線性佈局有3個子視圖,頂部的視圖高度固定的,而底部兩個視圖則按剩下的高度的4:6來進行分配則能夠設置以下:

 

 

 v1.frame  = CGRectMake(0,0,x, 30)

 v2.frame = CGRectZero

 v2.weight = 0.4

 

 v3.frame = CGRectZero

 v3.weight = 0.6

 

 

5、終極武器2:佈局視圖的高度和寬度徹底由子視圖來控制。

     在垂直佈局中,咱們知道佈局的高度能夠由全部子視圖動態調整,那麼寬度是否也能夠由子視圖來決定呢?這是能夠了!!當佈局中某個子視圖的寬度是肯定的,我麼能夠選擇由子視圖裏面最寬的那個視圖來決定佈局視圖的寬度。而佈局中的屬性wrapContentXXX則相似於android的wrap_content的值:

 

 

//高寬是否由子視圖決定,這兩個屬性只對線性和相對佈局有效,框架佈局無效

@property(nonatomic,assign)BOOL wrapContentWidth;

@property(nonatomic,assign)BOOL wrapContentHeight;

 

 

 

 

 

 

[objc]  view plain copy
  1. -(void)loadView  
  2. {  
  3.     [super loadView];  
  4.       
  5.     //佈局視圖中不須要指定寬度,而是由最大子視圖決定寬度  
  6.     MyLinearLayout *ll = [[MyLinearLayout alloc] initWithFrame:CGRectMake(100, 100, 0,0)];  
  7.     ll.orientation = LVORIENTATION_VERT;  
  8.     ll.wrapContentWidth = YES;  //這句話表示寬度的尺寸由最大的子視圖的寬度決定。  
  9.     ll.backgroundColor = [UIColor grayColor];  
  10.       
  11.     UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 90, 40)]; //這個子視圖最寬 10+90+20 父視圖的寬度爲110  
  12.     v1.backgroundColor = [UIColor redColor];  
  13.     v1.leftMargin = 10;  
  14.     v1.rightMargin = 20;  
  15.     v1.topMargin = 4;  
  16.     [ll addSubview:v1];  
  17.       
  18.     UIView *v2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 60)];  
  19.     v2.backgroundColor = [UIColor greenColor];  
  20.     v2.topMargin = 6;  
  21.     [ll addSubview:v2];  
  22.       
  23.       
  24.     UIView *v3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 75, 30)];  
  25.     v3.backgroundColor = [UIColor blueColor];  
  26.     v3.topMargin = 3;  
  27.     v3.bottomMargin = 4;  
  28.     [ll addSubview:v3];  
  29.       
  30.     [self.view addSubview:ll];  
  31.       
  32.   
  33. }  



 

 

上面的視圖中能夠看到佈局視圖的寬度是第一個視圖的寬度外加上leftMargin,rightMargin的總值,由於垂直佈局中的wrapContentHeight默認是設置爲YES的。

 

      有的時候咱們但願讓某個佈局視圖設置爲某個非佈局視圖的子視圖,好比咱們但願創建一個佈局視圖所有覆蓋到某個view下,這時候咱們同樣的能夠在將佈局視圖添加到非佈局視圖下時經過指定本身的leftMargin,rightMargin, topMargin,bottomMargin來設置佈局視圖距離父視圖的邊距值,一旦將某個佈局視圖放入到非佈局視圖時而且又但願這個佈局視圖隨非佈局視圖的大小而調整時,須要注意的是要將wrapContentHeight,wrapContentWidth 設置爲NO,由於若是設置爲YES的話就會產生布局的衝突。

 

6、終極武器3:視圖之間的間距也能夠是相對值。

     上面的全部佈局中,咱們可讓佈局視圖隨着子視圖的尺寸進行大小的調整,也可讓子視圖隨着佈局視圖的尺寸進行大小的調整,也可使用weight進行子視圖的按比例尺寸分配,也可使用gravity進行子視圖的位置和尺寸的控制。可是前面的代碼中全部的間距指定的都是固定值,正是由於間距部分是固定值,所以咱們仍是沒法好好的適配不一樣尺寸的屏幕,好比有時候咱們但願子視圖的尺寸是固定的,可是視圖之間的間距是隨着屏幕尺寸的大小而調整。在好比下面的登陸對話框

 

       

 

 

      咱們要求底部版權部分固定在底部,而且有固定的底部邊距,而中間的圖標和帳號輸入框的間距之間則須要根據佈局的大小的調整而進行縮放。這時候由於子視圖的高度是固定的,而間距是浮動的,所以解決的方法就是咱們不設置固定的間距,而是設置浮動的間距,將間距按必定比例進行指定。經過採用間距使用比例的方法咱們能夠很容易的實現則不一樣屏幕尺寸上以及橫向和縱向屏幕上進行完美的適配,這樣的話咱們是否是再也不須要size class了。 上面的子視圖擴展屬性中咱們已經看到了四個邊距值是能夠設置相對邊距的,當咱們把邊距設置爲>0而小於1的話,則代表是按比例來設置間距。咱們能夠看看以下代碼是如何實現上述功能的:

 

 

 

[objc]  view plain copy
  1. -(void)loadView  
  2. {  
  3.       
  4.       
  5.     MyLinearLayout *ll = [MyLinearLayout new];  
  6.     ll.backgroundColor = [UIColor grayColor];  
  7.     ll.autoAdjustSize  = NO;  
  8.     ll.gravity = MGRAVITY_HORZ_CENTER;  
  9.       
  10.     //頭像  
  11.     UIImageView *imgView = [UIImageView new];  
  12.     imgView.image = [UIImage imageNamed:@"user"];  
  13.     imgView.backgroundColor = [UIColor whiteColor];  
  14.     [imgView sizeToFit];  
  15.       
  16.     imgView.topMargin = 0.45;  
  17.       
  18.     [ll addSubview:imgView];  
  19.       
  20.       
  21.     //輸入框  
  22.     UITextField *txtField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 200, 40)];  
  23.     txtField.borderStyle = UITextBorderStyleLine;  
  24.     txtField.placeholder = @"請輸入用戶名稱";  
  25.     txtField.backgroundColor = [UIColor whiteColor];  
  26.       
  27.     txtField.topMargin = 0.1;  
  28.     txtField.bottomMargin = 0.45;  
  29.     [ll addSubview:txtField];  
  30.       
  31.     UILabel *lab = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];  
  32.     lab.bottomMargin = 20;  
  33.     lab.text = @"版權全部 XXX 公司";  
  34.     [lab sizeToFit];  
  35.       
  36.     [ll addSubview:lab];  
  37.       
  38.       
  39.     self.view = ll;  
  40.       
  41.       
  42. }  



 

上面的代碼中咱們能夠看到底部子視圖的bottomMargin使用的是固定的間距也就是保證在底部,而頭像和佈局,頭像和帳號,以及帳號和底部則採用的是相對的margin值,這樣就是實現了上述的功能了,這樣是否是很簡單。

 

經過相對間距和子視圖的weight屬性,咱們還能實現不少強大的功能,好比:

 

1.咱們想讓某個子視圖跟父視圖的邊距始終保持在總體寬度的20%左右,那麼咱們只須要爲子視圖的leftMargin = 0.2就能夠了。

2.咱們在一個垂直佈局中有3個子視圖,而且要求這三個子視圖的高度保持一致,同時間距也和高度保持一致,也就是平均分佈三個子視圖。

 

 

代碼以下:

 

 

[objc]  view plain copy
  1. -(void)loadView  
  2. {  
  3.       
  4.     MyLinearLayout *ll = [MyLinearLayout new];  
  5.     ll.backgroundColor = [UIColor grayColor];  
  6.     ll.wrapContentHeight  = NO;  
  7.     ll.leftPadding = 10;  
  8.     ll.rightPadding = 10;  
  9.       
  10.     UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 100)];  
  11.     v1.backgroundColor = [UIColor redColor];  
  12.     v1.leftMargin = v1.rightMargin = 0;  
  13.       
  14.       
  15.     [ll addSubview:v1];  
  16.      
  17.       
  18.     UIView *v2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 50)];  
  19.     v2.backgroundColor = [UIColor greenColor];  
  20.     v2.leftMargin = v2.rightMargin = 0;  
  21.      
  22.     [ll addSubview:v2];  
  23.   
  24.       
  25.       
  26.     UIView *v3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 70)];  
  27.     v3.backgroundColor = [UIColor blueColor];  
  28.     v3.leftMargin = v3.rightMargin = 0;  
  29.     [ll addSubview:v3];  
  30.   
  31.      
  32.     //每一個視圖的高度保持原始值,剩餘的部分平分間距  
  33.    // [ll averageMargin:NO];  
  34.     //會把視圖和間距都平分,即便設置了高度也無效。  
  35.     [ll averageSubviews:YES];  
  36.       
  37.     self.view = ll;  
  38.       
  39.       
  40. }  



 



 

三個子視圖和間距的高度都是平均的。看以下函數:

 

-(void)averageSubviews:(BOOL)centered;

 

這個函數用來指定將子視圖和間距平均分配,centered表示是否總體居中,也就是是否保留頂部和底部的邊距。

 

 

-(void)averageMargin:(BOOL)centered;

 

這個函數要求每一個子視圖都具備固定的高度或者寬度,而是把全部剩餘的間距所有平分,一樣centered也表示視圖是否居中。

 

須要注意的是上面兩個函數只對以前添加的視圖有效,後續添加的視圖是無效的。

 

7、終極武器4:UITableView的替代品。

    實踐中咱們常用UITableView來佈局一些靜態的CELL,這種方式在某些場合確實很方面,既能夠重用又能夠很方便的使用滾動視圖的功能,可是靜態CELL一個最致命的問題是,有時候咱們的某個CELL的高度是要求動態變化的,並且有時候咱們的CELL裏面有UILabel,裏面的內容假如很長的話須要換行顯示,從而調整CELL的高度,因而咱們就只能在:

 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

 

動態計算CELL的高度,而後又在CELL中進行各類麻煩的佈局,並且這個問題AutoLayout是沒法解決的。我象形不少人都會在這個問題上寫不少代碼。還有一個場景是咱們的CELL之間是能夠設置分割線的,可是有時候有些需求是咱們要求頂部沒有線,底部沒有線等等一些奇怪的問題,因而乎咱們就須要在CELL中插入背景視圖而且把CELL的分割線屬性取消來解決這個問題,還有一個場景是由於CELL是能夠複用的,一旦CELL不可見系統自動刪除子視圖的內容(注意這時候子視圖上的一些狀態是沒法保留的),而後出現時你又要從新根據狀態來設置CELL中的內容,這樣你就須要單獨的保存各類視圖的狀態數據。

      其實對於一些靜態CELL的狀況下由於CELL的數量很少,咱們徹底不須要考慮內存以及複用的問題。咱們只要在UIScrollView上直接線性佈局就能夠了。這時候咱們就能夠祭出MyLayout的兩個大殺器了:

 

邊界線繪製以及佈局的觸摸處理事件

 

經過這兩個屬性就能夠徹底把一個MyLinearLayout當作一個CELL來使用了。

邊界線繪製爲咱們實現四個邊界的線條的繪製,他支持線條的顏色,粗細,縮進,立體,點線的繪製:

 

 

//指定四個邊界線的繪製。

@property(nonatomic,strong)MyBorderLineDraw *leftBorderLine;

@property(nonatomic,strong)MyBorderLineDraw *rightBorderLine;

@property(nonatomic,strong)MyBorderLineDraw *topBorderLine;

@property(nonatomic,strong)MyBorderLineDraw *bottomBorderLine;

 

//同時設置4個邊界線。

@property(nonatomic,strong)MyBorderLineDraw *boundBorderLine;

 

 

而後MyBorderLineDraw的定義以下:

 

 

@interface MyBorderLineDraw :NSObject

 

@property(nonatomic)UIColor *color;            //顏色

@property(nonatomic)UIColor *insetColor;       //嵌入顏色,用於實現立體效果

@property(nonatomic,assign)CGFloat thick;      //厚度,默認爲1

@property(nonatomic,assign)CGFloat headIndent; //頭部縮進

@property(nonatomic,assign)CGFloat tailIndent; //尾部縮進

@property(nonatomic,assign)CGFloat dash;       //虛線的點數若是爲0則是實線。

 

-(id)initWithColor:(UIColor*)color;

 

 

@end

 

 

經過邊界線咱們能夠實現佈局視圖四個方向的邊界線的繪製。佈局視圖的另外兩個屬性以下:

 

 

 

//高亮的背景色,咱們支持在佈局中執行單擊的事件,用戶按下時背景會高亮.只有設置了事件纔會高亮

@property(nonatomic,strong)UIColor *highlightedBackgroundColor;

 

//設置單擊觸摸的事件,若是target爲nil則取消事件。

-(void)setTarget:(id)target action:(SEL)action;

 

 

沒錯!咱們能夠爲佈局視圖設置單擊處理事件!以及單擊時的高亮顯示顏色。這兩個功能是代替

 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;

 

的強有力武器,只要咱們把一個垂直MyLinearLayout做爲UIScrollView的子視圖,而且垂直的MyLinearLayout中加入多個水平的MyLinearLayout子視圖(起到CELL的功能),而後爲每一個水平的子佈局視圖添加時間處理函數就行了。 廢話這麼多,上界面吧。代碼由於比較多就不貼出來了,直接看DEMO中的就能夠了。

 

 

 

 

 

8、總結

     MyLinearLayout的功能基本就介紹完成了,最後須要總結的是: MyLinearLayout能夠徹底勝任屏幕的旋轉,各類尺寸的完美適配。各類版本操做系統的完美適配,開發簡單易用並且功能強大,並且他不是基於AutoLayout的也不是基於Size Class,沒有版本限制,也不須要學習新的佈局知識。

 

 最後歡迎你們到個人github中去下載庫和DEMO。

https://github.com/youngsoft/MyLinearLayout

相關文章
相關標籤/搜索