Autolayout 第三方開源庫

轉載自:http://blog.csdn.net/hmt20130412/article/details/46638625html

今天才發現CSDN支持markdown了…仍是給出新博客地址:Autolayout優秀的第三方開源庫ios

最近項目開始用純代碼佈局整個UI框架, 對於前一段很長時間都是xib+storyboard狂拖控件約束的我來講,天天寫的代碼量劇增…對於sb好仍是純代碼好的爭論,能夠參考下巧大大的分析
說到UI適配佈局,通常有兩種方法: 
* frame,利用[UIScreen mainScreen].bounds.size.width/height,一個一個的算出對應frame,結果確定是OK的,只是過程異常的痛苦,尤爲像我這種語文老師教的數學的小學生.囧. 
* autolayout,相信確定是主流佈局,並且對於UI設計師給個人效果圖,也是很方便咱們直接拿來進行約束設值,無須其餘任何計算.git

這裏主要介紹手寫autolayout約束,因爲系統提供的api寫起來又臭又長,推薦一個不錯的第三方. 
OC版本對應的是Masonry,Swift版本對應的是SnapKit.固然還有其餘優秀的autolayout相關第三方,會在結尾給出,感興趣的朋友能夠去研究下,LZ主要用Masonry(大愛這種鏈式語法)^_^!github

Masonry

Github地址是:Masonry 
具體用法github上已經講的很清楚了,能夠下載Demo看看栗子的實現,總結一下我在使用過程當中瞭解. 
mas_makeConstraints使用最多,作初始約束,只負責新增約束 
mas_updateConstraints針對make中的約束作更新,通常不添加新約束,只是對於原約束數值的修改. 
mas_remakeConstraints清除以前全部的約束,採用裏面設置的最新約束,經常使用於動畫以後新位置的約束設定 
* 優先級高.priorityHigh,優先級低.priorityLow,一般用於根據條件判斷來設定優先響應哪一種約束 
multipliedBy(x)= *x,dividedBy(x) = /x 
* 「` 
make.edges.mas_equalTo(UIEdgeInsetsMake(10, 10, 10, 10)); 
// edges就是至關於top-left-bottom-right 
// top和left裏的offset爲正數 
// 那麼爲何bottom和right裏的offset是負數呢? 由於這裏計算的是絕對的數值 計算的bottom須要小於sv的底部高度 因此要-10 同理用於right 
// 有意思的地方是and和with 其實這兩個函數什麼事情都沒作,能夠省略的swift

/* 等價於
     make.top.equalTo(weakSelf.sv).with.offset(10);
     make.left.equalTo(weakSelf.sv).with.offset(10);
     make.bottom.equalTo(weakSelf.sv).with.offset(-10);
     make.right.equalTo(weakSelf.sv).with.offset(-10);
     */

「`api

  • UIScrollView是一個有點特殊的view,對於在裏面放其餘view,最好的作法是先放一個containerView設置edges相等,而後在此view上添加subview.
  • 模仿系統的UITabBarController的底部View,能夠設定個數和間隔:xcode

    - (void)simulateSystemTabBarWithButtonCount:(NSInteger)count withSpace:(CGFloat)space {
    [self.view showPlaceHolder]; self.view.backgroundColor = [UIColor grayColor]; NSMutableArray *viewArray = [NSMutableArray arrayWithCapacity:10]; for (int i = 0; i < count; i++) { UIView *view = [UIView new]; view.backgroundColor = [UIColor colorWithHue:( arc4random() % 256 / 256.0 ) saturation:( arc4random() % 128 / 256.0 ) + 0.5 brightness:( arc4random() % 128 / 256.0 ) + 0.5 alpha:1];; [view showPlaceHolder]; [self.view addSubview:view]; [viewArray addObject:view]; } UIView *lastView = viewArray.lastObject; for (int i = 0; i < count; i++) { UIView *view = (UIView *)viewArray[i]; [view mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.equalTo(view.superview); make.height.equalTo(@49); make.width.equalTo(lastView); if (i == 0) { make.left.mas_equalTo(view.superview).offset(space); } else { UIView *frontView = (UIView *)viewArray[i-1]; make.left.equalTo(frontView.mas_right).offset(space); (i == viewArray.count - 1) ? make.right.mas_equalTo(view.superview).offset(-space) : nil; } }]; } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    以count = 4 和 space =0 爲例子 
    markdown

  • 實現動畫時,更新約束後調用layoutIfNeeded
  • 最後,再次強調真的很是好用!!!

SnapKit

Github地址:SnapKit 
PS:目前只支持swift1.2版本,在最新的xcode7-swift2.0中會報錯,我在推特上問了做者,他說最近略忙,暫時沒空…囧…有興趣的朋友能夠本身改下讓它支持2.0而後pull…我?還在研究中. 
這個就不過多舉例了,基本就是跟Masonry同樣,並且我在後面的Demo基本都是用了Snapkit來寫(xcode7上我是拖控件…沒辦法,誰讓還不支持2.0) 
舉個栗子->最多見的上下兩個button: 
app

其餘資料

相關文章
相關標籤/搜索