magicnumber -> autoresizingmask -> autolayout
以上是純手寫**所經歷的關於頁面布局的三個時期
在iphone1-iphone3gs時代 window的size固定為(320,480) 我們只需要簡單計算一下相對位置就好了
在iphone4-iphone4s時代 蘋果推出了retina屏 但是給了碼農們非常大的福利:window的size不變
在iphone5-iphone5s時代 window的size變了(320,568) 這時autoresizingmask派上了用場(為啥這時候不用autolayout? 因為還要支援ios5唄) 簡單的適配一下即可
在iphone6+時代 window的width也發生了變化(相對5和5s的螢幕比例沒有變化) 終於是時候拋棄autoresizingmask改用autolayout了(不用支援ios5了 相對於螢幕適配的多樣性來說autoresizingmask也已經過時了)
簡單介紹 masonry是乙個輕量級的布局框架,擁有自己的描述語法,採用更優雅的鏈式語法封裝自動布局,簡潔明瞭並具有高可讀性,而且同時支援 ios 和 max os x。masonry是乙個用**寫ios或os介面的庫,可以代替auto layout。
masonry 原始碼:
-定義以下兩個巨集,在使用masonry框架時就不需要加mas_字首了(定義巨集一定要在引入masonry.**件之前).
//1. 對於約束引數可以省去"mas_"
#define mas_shorthand
//2. 對於預設的約束引數自動裝箱
#define mas_shorthand_globals
- 引入標頭檔案 #import "masonry.h"
複製**
@property (nonatomic, strong, readonly) masconstraint *left;
@property (nonatomic, strong, readonly) masconstraint *top;
@property (nonatomic, strong, readonly) masconstraint *right;
@property (nonatomic, strong, readonly) masconstraint *bottom;
@property (nonatomic, strong, readonly) masconstraint *leading;
@property (nonatomic, strong, readonly) masconstraint *trailing;
@property (nonatomic, strong, readonly) masconstraint *width;
@property (nonatomic, strong, readonly) masconstraint *height;
@property (nonatomic, strong, readonly) masconstraint *centerx;
@property (nonatomic, strong, readonly) masconstraint *centery;
@property (nonatomic, strong, readonly) masconstraint *baseline;
複製**
- (nsarray *)mas_makeconstraints:(void(^)(masconstraintmaker *make))block;
- (nsarray *)mas_updateconstraints:(void(^)(masconstraintmaker *make))block;
- (nsarray *)mas_remakeconstraints:(void(^)(masconstraintmaker *make))block;
/*mas_makeconstraints 只負責新增約束 autolayout不能同時存在兩條針對於同一物件的約束 否則會報錯
mas_updateconstraints 針對上面的情況 會更新在block**現的約束 不會導致出現兩個相同約束的情況
mas_remakeconstraints 則會清除之前的所有約束 僅保留最新的約束
三種函式善加利用 就可以應對各種情況了
*/複製**
mas_makeconstraints 是給view新增約束,約束有幾種,分別是邊距,寬,高,左上右下距離,基準線。新增過約束後可以有修正,修正有offset(位移)修正和multipliedby(倍率)修正。
語法一般是 make.equalto or make.greaterthanorequalto or make.lessthanorequalto + 倍數和位移修正。
當約束衝突發生的時候,我們可以設定view的key來定位是哪個view
redview.mas_key = @"redview";
greenview.mas_key = @"greenview";
blueview.mas_key = @"blueview";
複製**
若是覺得這樣乙個個設定比較繁瑣,怎麼辦呢,masonry則提供了批量設定的巨集
masattachkeys
masattachkeys(redview,greenview,blueview); //一句**即可全部設定
複製**
注意點1: 使用 mas_makeconstraints方法的元素必須事先新增到父元素的中,例如[self.view addsubview:view];
注意點2: mas_equalto 和 equalto 區別:mas_equalto 比equalto多了型別轉換操作,一般來說,大多數時候兩個方法都是 通用的,但是對於數值元素使用mas_equalto。對於物件或是多個屬性的處理,使用equalto。特別是多個屬性時,必須使用equalto,例如 make.left.and.right.equalto(self.view);
注意點3: 注意到方法with和and,這連個方法其實沒有做任何操作,方法只是返回物件本身,這這個方法的左右完全是為了方法寫的時候的可讀性 。make.left.and.right.equalto(self.view);和make.left.right.equalto(self.view);是完全一樣的,但是明顯的加了and方法的語句可讀性 更好點。
// exp1: 中心點與self.view相同,寬度為400*400
-(void)exp1];
}//exp2: 上下左右邊距都為10
-(void)exp2];
}//exp3 讓兩個高度為150的view垂直居中且等寬且等間隔排列 間隔為10
-(void)exp3];
[view2 mas_makeconstraints:^(masconstraintmaker *make) ];
}複製**
//高階布局練習 ios自帶計算器布局
-(void)exp4];
[keyboardview mas_makeconstraints:^(masconstraintmaker *make) ];
//設定顯示位置的數字為0
uilabel *displaynum = [[uilabel alloc]init];
[displayview addsubview:displaynum];
displaynum.text = @"0";
displaynum.font = [uifont fontwithname:@"heiti sc" size:70];
displaynum.textcolor = [uicolor whitecolor];
displaynum.textalignment = nstextalignmentright;
[displaynum mas_makeconstraints:^(masconstraintmaker *make) ];
//定義鍵盤鍵名稱,?號代表合併的單元格
nsarray *keys = @[@"ac",@"+/-",@"%",@"÷"
,@"7",@"8",@"9",@"x"
,@"4",@"5",@"6",@"-"
,@"1",@"2",@"3",@"+"
,@"0",@"?",@".",@"="];
int indexofkeys = 0;
for (nsstring *key in keys)];
}if([key isequaltostring:@"?"])
}//正常的單元格
else
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
default:
break;
}//按照行和列新增約束,這裡新增列約束
switch (colnum)
break;
case 2:
break;
case 3:
break;
case 4:
break;
default:
break;}}
}];}
}複製**
Masonry的簡單使用
首先,在正式使用masonry之前,我們先來看看在xib中我們是如何使用autolayout 從圖中我們可以看出,只要設定相應得侷限,控制好父檢視與子檢視之間的關係就應該很ok的拖出你需要的需求。這裡就不詳細講解具體拖拽的方法.然後,我們按著上圖的屬性來看看如何簡單得使用masonry 這裡是mas...
Masonry的簡單使用
首先,在正式使用masonry之前,我們先來看看在xib中我們是如何使用autolayout 從圖中我們可以看出,只要設定相應得侷限,控制好父檢視與子檢視之間的關係就應該很ok的拖出你需要的需求。這裡就不詳細講解具體拖拽的方法.然後,我們按著上圖的屬性來看看如何簡單得使用masonry 這裡是mas...
初識Masonry,總結簡單使用方法
前情 因專案多人開發,決定棄用xib了,所以改用masonry來進行autolayout布局,這裡簡單總結下使用方法。常用方法 label為例 self.titlelabel mas makeconstraints masconstraintmaker make make.left.top.mas ...