1. 程式人生 > >關於iOS自動佈局

關於iOS自動佈局

這裡做一個通過程式碼實現自動佈局的Demo,通過IB來做的就不講了,網上相關的資料很多,這裡給出一個寫的不錯的連結,有興趣的同學自己看吧.

要談自動佈局,那基本的檢視是第一步,做了一個這樣的ViewController

  1. <span style="font-size:18px;">//
  2. //  NESMainViewController.m
  3. //  AutoLayout
  4. //
  5. //  Created by Nestor on 14-3-2.
  6. //  Copyright (c) 2014年 NesTalk. All rights reserved.
  7. //
  8. #import "NESMainViewController.h"
  9. @interface NESMainViewController ()  
  10. @property (nonatomic,retainUIView *view1;  
  11. @property (nonatomic,retainUIView *view2;  
  12. @property (nonatomic,retainUIView *view3;  
  13. @end
  14. @implementation NESMainViewController  
  15. -(UIView *)view1
  16. {  
  17.     if (!_view1) {  
  18.         _view1 = [[UIView alloc
    ] initWithFrame:CGRectMake(1030145200)];  
  19.         _view1.backgroundColor = [UIColor greenColor];  
  20.     }  
  21.     return _view1;  
  22. }  
  23. -(UIView *)view2
  24. {  
  25.     if (!_view2) {  
  26.         _view2 = [[UIView alloc] initWithFrame:CGRectMake(16530145200)];  
  27.         _view2.backgroundColor = [UIColor
     yellowColor];  
  28.     }  
  29.     return _view2;  
  30. }  
  31. -(UIView *)view3
  32. {  
  33.     if (!_view3) {  
  34.         _view3 = [[UIView alloc] initWithFrame:CGRectMake(10240300300)];  
  35.         _view3.backgroundColor = [UIColor blueColor];  
  36.     }  
  37.     return _view3;  
  38. }  
  39. -(void)buildLayout  
  40. {  
  41.     [self.view addSubview:self.view1];  
  42.     [self.view addSubview:self.view2];  
  43.     [self.view addSubview:self.view3];  
  44. }  
  45. - (void)viewDidLoad  
  46. {  
  47.     [super viewDidLoad];  
  48.     [self buildLayout];  
  49. }  
  50. - (void)didReceiveMemoryWarning  
  51. {  
  52.     [super didReceiveMemoryWarning];  
  53.     // Dispose of any resources that can be recreated.
  54. }  
  55. @end
  56. </span>  
看完這個類,有必要先說一下我的程式碼風格,對於很多剛剛做iOS開發不久的程式設計師看這部分程式碼可能感覺很麻煩~但是按照這種風格進行編碼是有很大好處的.

先看這段程式碼

  1. <span style="font-size:18px;">-(UIView *)view1
  2. {  
  3.     if (!_view1) {  
  4.         _view1 = [[UIView alloc] initWithFrame:CGRectMake(1030145200)];  
  5.         _view1.backgroundColor = [UIColor greenColor];  
  6.     }  
  7.     return _view1;  
  8. }</span>  

這段程式碼的寫法經常能夠看到,單例裡面有他,TableView的代理方法能用到他,這裡屬於重寫@property的getter方法,簡單來說,通過點語法來呼叫私有成員變數:self.view1來呼叫該方法,有兩大好處

1.分離了不同方法的構造內容,程式碼層次更加明顯.

2.延遲載入,什麼時候需要什麼時候建立,而不是統一在ViewDidLoad方法中進行建立,對於複雜的檢視控制器來說可以優化執行效率.

再看ViewDidLoad方法裡

  1. <span style="font-size:18px;">- (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.     [self buildLayout];  
  5. }</span>  

非常簡單,呼叫了一個buildLayout方法,看方法名就能夠知道,這裡是專門用來初始化檢視佈局的方法,由於在oc中init開頭的方法被看做類的初始化方法,故此使用了build,當然這屬於個人習慣,無所謂的事~

buildLayout方法則逐個將要新增的控制元件放到了view上

  1. <span style="font-size:18px;">-(void)buildLayout  
  2. {  
  3.     [self.view addSubview:self.view1];  
  4.     [self.view addSubview:self.view2];  
  5.     [self.view addSubview:self.view3];  
  6. }</span>  

這裡就能夠明顯的看到通過重寫getter方法來初始化檢視的好處了,都添加了哪些控制元件一目瞭然,如果需要修改某一個控制元件,那直接定位到對應的getter方法修改即可,而無需在大量的程式碼中搜索那麼幾行程式碼.

根據這樣的程式碼佈局進行編寫,對於單一檢視控制器來說,就可以有了這樣的分層效果:


閒話到這,繼續主題.

程式碼到這裡螢幕上的檢視應該如下圖所示


是我們需要的佈局效果,但是如果螢幕橫過來,問題就出現了


接下來就需要對程式碼進行一定的調整來完成自動佈局.

從iOS6開始...應該是這時候開始吧,想不起來了,加入了NSLayoutConstraint,這個就是做自動佈局需要用到的東西

在使用NSLayoutConstraint的時候需要用到一種Visual Format Language,不是特別難的東西,本文的Demo裡會簡單介紹,更深層的東西有興趣自己搜尋一下吧.

首先需要在