關(guān)于Masonry的使用和注意點(diǎn)

因?yàn)橹伴_發(fā)時(shí)都是在xib文件中添加約束,或者代碼中計(jì)算frame并沒有接觸過Masonry,現(xiàn)在寫篇博客來歸納總結(jié)下Masonry的使用和注意點(diǎn)撩炊。這篇文章只是簡(jiǎn)單介紹Masonry放仗,以及Masonry的使用,并且會(huì)舉一些例子出來包警。但并不會(huì)涉及到Masonry的內(nèi)部實(shí)現(xiàn)

Masonry中的坑:

在使用Masonry進(jìn)行約束時(shí)撵摆,有一些是需要注意的。

在使用Masonry添加約束之前害晦,需要在addSubview之后才能使用特铝,否則會(huì)導(dǎo)致崩潰。
在添加約束時(shí)初學(xué)者經(jīng)常會(huì)出現(xiàn)一些錯(cuò)誤壹瘟,約束出現(xiàn)問題的原因一般就是兩種:約束沖突和缺少約束鲫剿。對(duì)于這兩種問題,可以通過調(diào)試和log排查稻轨。
之前使用Interface Builder添加約束灵莲,如果約束有錯(cuò)誤直接就可以看出來,并且會(huì)以紅色或者黃色警告體現(xiàn)出來殴俱。而Masonry則不會(huì)直觀的體現(xiàn)出來政冻,而是以運(yùn)行過程中崩潰或者打印異常log體現(xiàn)枚抵,所以這也是手寫代碼進(jìn)行AutoLayout的一個(gè)缺點(diǎn)。
這個(gè)問題只能通過多敲代碼明场,積攢純代碼進(jìn)行AutoLayout的經(jīng)驗(yàn)俄精,慢慢就用起來越來越得心應(yīng)手了。

Masonry基礎(chǔ)使用

Masonry基礎(chǔ)API
mas_makeConstraints() 添加約束.
mas_remakeConstraints() 移除之前的約束榕堰,重新添加新的約束.
mas_updateConstraints() 更新約束

equalTo() 參數(shù)是對(duì)象類型竖慧,一般是視圖對(duì)象或者mas_width這樣的坐標(biāo)系對(duì)象

mas_equalTo() 和上面功能相同,參數(shù)可以傳遞基礎(chǔ)數(shù)據(jù)類型對(duì)象逆屡,可以理解為比上面的API更強(qiáng)大

width() 用來表示寬度圾旨,例如代表view的寬度

mas_width() 用來獲取寬度的值。和上面的區(qū)別在于魏蔗,一個(gè)代表某個(gè)坐標(biāo)系對(duì)象砍的,一個(gè)用來獲取坐標(biāo)系對(duì)象的值
Auto Boxing

上面例如equalTo或者width這樣的,有時(shí)候需要涉及到使用mas_前綴莺治,這在開發(fā)中需要注意作區(qū)分廓鞠。

如果在當(dāng)前類引入#import "Masonry.h"之前,用下面兩種宏定義聲明一下谣旁,就不需要區(qū)分mas_前綴床佳。

// 定義這個(gè)常量,就可以不用在開發(fā)過程中使用"mas_"前綴榄审。

define MAS_SHORTHAND

// 定義這個(gè)常量砌们,就可以讓Masonry幫我們自動(dòng)把基礎(chǔ)數(shù)據(jù)類型的數(shù)據(jù),自動(dòng)裝箱為對(duì)象類型搁进。

define MAS_SHORTHAND_GLOBALS

修飾語句

Masonry為了讓代碼使用和閱讀更容易理解浪感,所以直接通過點(diǎn)語法就可以調(diào)用,還添加了and和with兩個(gè)方法饼问。這兩個(gè)方法內(nèi)部實(shí)際上什么都沒干影兽,只是在內(nèi)部將self直接返回,功能就是為了更加方便閱讀莱革,對(duì)代碼執(zhí)行沒有實(shí)際作用峻堰。

例如下面的例子:

make.top.and.bottom.equalTo(self.containerView).with.offset(padding);
其內(nèi)部代碼實(shí)現(xiàn),實(shí)際上就是直接將self返回驮吱。

  • (MASConstraint *)with {
    return self;
    }
    更新約束和布局

關(guān)于更新約束布局相關(guān)的API茧妒,主要用以下四個(gè)API:

  • (void)updateConstraintsIfNeeded 調(diào)用此方法,如果有標(biāo)記為需要重新布局的約束左冬,則立即進(jìn)行重新布局桐筏,內(nèi)部會(huì)調(diào)用updateConstraints方法
  • (void)updateConstraints 重寫此方法,內(nèi)部實(shí)現(xiàn)自定義布局過程
  • (BOOL)needsUpdateConstraints 當(dāng)前是否需要重新布局拇砰,內(nèi)部會(huì)判斷當(dāng)前有沒有被標(biāo)記的約束
  • (void)setNeedsUpdateConstraints 標(biāo)記需要進(jìn)行重新布局
    關(guān)于UIView重新布局相關(guān)的API梅忌,主要用以下三個(gè)API:
  • (void)setNeedsLayout 標(biāo)記為需要重新布局
  • (void)layoutIfNeeded 查看當(dāng)前視圖是否被標(biāo)記需要重新布局狰腌,有則在內(nèi)部調(diào)用layoutSubviews方法進(jìn)行重新布局
  • (void)layoutSubviews 重寫當(dāng)前方法,在內(nèi)部完成重新布局操作
    Masonry示例代碼

Masonry本質(zhì)上就是對(duì)系統(tǒng)AutoLayout進(jìn)行的封裝牧氮,包括里面很多的API琼腔,都是對(duì)系統(tǒng)API進(jìn)行了一次二次包裝。

typedef NS_OPTIONS(NSInteger, MASAttribute) {

MASAttributeLeft = 1 << NSLayoutAttributeLeft,    
MASAttributeRight = 1 << NSLayoutAttributeRight,  
MASAttributeTop = 1 << NSLayoutAttributeTop,   
MASAttributeBottom = 1 << NSLayoutAttributeBottom,  
MASAttributeLeading = 1 << NSLayoutAttributeLeading,  
MASAttributeTrailing = 1 << NSLayoutAttributeTrailing,  
MASAttributeWidth = 1 << NSLayoutAttributeWidth,  
MASAttributeHeight = 1 << NSLayoutAttributeHeight,  
MASAttributeCenterX = 1 << NSLayoutAttributeCenterX,  
MASAttributeCenterY = 1 << NSLayoutAttributeCenterY,  
MASAttributeBaseline = 1 << NSLayoutAttributeBaseline,  

};
常用方法

設(shè)置內(nèi)邊距

/**
設(shè)置yellow視圖和self.view等大踱葛,并且有10的內(nèi)邊距丹莲。
注意根據(jù)UIView的坐標(biāo)系,下面right和bottom進(jìn)行了取反尸诽。所以不能寫成下面這樣甥材,否則right、bottom這兩個(gè)方向會(huì)出現(xiàn)問題性含。
make.edges.equalTo(self.view).with.offset(10);

除了下面例子中的offset()方法洲赵,還有針對(duì)不同坐標(biāo)系的centerOffset()、sizeOffset()商蕴、valueOffset()之類的方法叠萍。
*/
[self.yellowView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.view).with.offset(10);
make.top.equalTo(self.view).with.offset(10);
make.right.equalTo(self.view).with.offset(-10);
make.bottom.equalTo(self.view).with.offset(-10);
}];
通過insets簡(jiǎn)化設(shè)置內(nèi)邊距的方式

// 下面的方法和上面例子等價(jià),區(qū)別在于使用insets()方法绪商。
[self.blueView mas_makeConstraints:^(MASConstraintMaker *make) {
// 下苛谷、右不需要寫負(fù)號(hào),insets方法中已經(jīng)為我們做了取反的操作了部宿。
make.edges.equalTo(self.view).with.insets(UIEdgeInsetsMake(10, 10, 10, 10));
}];
更新約束

// 設(shè)置greenView的center和size抄腔,這樣就可以達(dá)到簡(jiǎn)單進(jìn)行約束的目的
[self.greenView mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
// 這里通過mas_equalTo給size設(shè)置了基礎(chǔ)數(shù)據(jù)類型的參數(shù),參數(shù)為CGSize的結(jié)構(gòu)體
make.size.mas_equalTo(CGSizeMake(300, 300));
}];

// 為了更清楚的看出約束變化的效果理张,在顯示兩秒后更新約束。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.greenView mas_updateConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self.view).offset(100);
make.size.mas_equalTo(CGSizeMake(100, 100));
}];
});
大于等于和小于等于某個(gè)值的約束

[self.textLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
// 設(shè)置寬度小于等于200
make.width.lessThanOrEqualTo(@200);
// 設(shè)置高度大于等于10
make.height.greaterThanOrEqualTo(@(10));
}];
self.textLabel.text = @"這是測(cè)試的字符串绵患。能看到1雾叭、2、3個(gè)步驟落蝙,第一步當(dāng)然是上傳照片了织狐,要上傳正面近照哦。上傳后筏勒,網(wǎng)站會(huì)自動(dòng)識(shí)別你的面部移迫,如果覺得識(shí)別的不準(zhǔn),你還可以手動(dòng)修改一下管行。左邊可以看到16項(xiàng)修改參數(shù)厨埋,最上面是整體修改,你也可以根據(jù)自己的意愿單獨(dú)修改某項(xiàng)捐顷,將鼠標(biāo)放到選項(xiàng)上面荡陷,右邊的預(yù)覽圖會(huì)顯示相應(yīng)的位置雨效。";

textLabel只需要設(shè)置一個(gè)屬性即可

self.textLabel.numberOfLines = 0;
使用基礎(chǔ)數(shù)據(jù)類型當(dāng)做參數(shù)

/**
如果想使用基礎(chǔ)數(shù)據(jù)類型當(dāng)做參數(shù),Masonry為我們提供了"mas_xx"格式的宏定義废赞。
這些宏定義會(huì)將傳入的基礎(chǔ)數(shù)據(jù)類型轉(zhuǎn)換為NSNumber類型徽龟,這個(gè)過程叫做封箱(Auto Boxing)。

"mas_xx"開頭的宏定義唉地,內(nèi)部都是通過MASBoxValue()函數(shù)實(shí)現(xiàn)的据悔。
這樣的宏定義主要有四個(gè),分別是mas_equalTo()耘沼、mas_offset()和大于等于屠尊、小于等于四個(gè)。
*/
[self.redView mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
make.width.mas_equalTo(100);
make.height.mas_equalTo(100);
}];
設(shè)置約束優(yōu)先級(jí)

/**
Masonry為我們提供了三個(gè)默認(rèn)的方法耕拷,priorityLow()讼昆、priorityMedium()、priorityHigh()骚烧,這三個(gè)方法內(nèi)部對(duì)應(yīng)著不同的默認(rèn)優(yōu)先級(jí)浸赫。
除了這三個(gè)方法,我們也可以自己設(shè)置優(yōu)先級(jí)的值赃绊,可以通過priority()方法來設(shè)置既峡。
*/
[self.redView mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
make.width.equalTo(self.view).priorityLow();
make.width.mas_equalTo(20).priorityHigh();
make.height.equalTo(self.view).priority(200);
make.height.mas_equalTo(100).priority(1000);
}];

Masonry也幫我們定義好了一些默認(rèn)的優(yōu)先級(jí)常量,分別對(duì)應(yīng)著不同的數(shù)值碧查,優(yōu)先級(jí)最大數(shù)值是1000运敢。
static const MASLayoutPriority MASLayoutPriorityRequired = UILayoutPriorityRequired;
static const MASLayoutPriority MASLayoutPriorityDefaultHigh = UILayoutPriorityDefaultHigh;
static const MASLayoutPriority MASLayoutPriorityDefaultMedium = 500;
static const MASLayoutPriority MASLayoutPriorityDefaultLow = UILayoutPriorityDefaultLow;
static const MASLayoutPriority MASLayoutPriorityFittingSizeLevel = UILayoutPriorityFittingSizeLevel;
設(shè)置約束比例

// 設(shè)置當(dāng)前約束值乘以多少,例如這個(gè)例子是redView的寬度是self.view寬度的0.2倍忠售。
[self.redView mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
make.height.mas_equalTo(30);
make.width.equalTo(self.view).multipliedBy(0.2);
}];
小練習(xí)

子視圖等高練習(xí)

/**
下面的例子是通過給equalTo()方法傳入一個(gè)數(shù)組传惠,設(shè)置數(shù)組中子視圖及當(dāng)前make對(duì)應(yīng)的視圖之間等高。

需要注意的是稻扬,下面block中設(shè)置邊距的時(shí)候卦方,應(yīng)該用insets來設(shè)置,而不是用offset泰佳。
因?yàn)橛胦ffset設(shè)置right和bottom的邊距時(shí)盼砍,這兩個(gè)值應(yīng)該是負(fù)數(shù),所以如果通過offset來統(tǒng)一設(shè)置值會(huì)有問題逝她。
*/
CGFloat padding = LXZViewPadding;
[self.redView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.top.equalTo(self.view).insets(UIEdgeInsetsMake(padding, padding, 0, padding));
make.bottom.equalTo(self.blueView.mas_top).offset(-padding);
}];

[self.blueView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self.view).insets(UIEdgeInsetsMake(0, padding, 0, padding));
make.bottom.equalTo(self.yellowView.mas_top).offset(-padding);
}];

/**
下面設(shè)置make.height的數(shù)組是關(guān)鍵浇坐,通過這個(gè)數(shù)組可以設(shè)置這三個(gè)視圖高度相等。其他例如寬度之類的黔宛,也是類似的方式近刘。
*/
[self.yellowView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.bottom.equalTo(self.view).insets(UIEdgeInsetsMake(0, padding, padding, padding));
make.height.equalTo(@[self.blueView, self.redView]);
}];
子視圖垂直居中練習(xí)

/**
要求:(這個(gè)例子是在其他人博客里看到的,然后按照要求自己寫了下面這段代碼)
兩個(gè)視圖相對(duì)于父視圖垂直居中,并且兩個(gè)視圖以及父視圖之間的邊距均為10跌宛,高度為150酗宋,兩個(gè)視圖寬度相等。
*/
CGFloat padding = 10.f;
[self.blueView mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self.view);
make.left.equalTo(self.view).mas_offset(padding);
make.right.equalTo(self.redView.mas_left).mas_offset(-padding);
make.width.equalTo(self.redView);
make.height.mas_equalTo(150);
}];

[self.redView mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self.view);
make.right.equalTo(self.view).mas_offset(-padding);
make.width.equalTo(self.blueView);
make.height.mas_equalTo(150);
}];
UITableView動(dòng)態(tài)Cell高度

在iOS UI開發(fā)過程中疆拘,UITableView的動(dòng)態(tài)Cell高度一直都是個(gè)問題蜕猫。實(shí)現(xiàn)這樣的需求,實(shí)現(xiàn)方式有很多種哎迄,只是實(shí)現(xiàn)起來復(fù)雜程度和性能的區(qū)別回右。

在不考慮性能的情況下,tableView動(dòng)態(tài)Cell高度漱挚,可以采取估算高度的方式翔烁。如果通過估算高度的方式實(shí)現(xiàn)的話,無論是純代碼還是Interface Builder旨涝,都只需要兩行代碼就可以完成Cell自動(dòng)高度適配蹬屹。

實(shí)現(xiàn)方式:

需要設(shè)置tableView的rowHeight屬性,這里設(shè)置為自動(dòng)高度白华,告訴系統(tǒng)Cell的高度是不固定的慨默,需要系統(tǒng)幫我們進(jìn)行計(jì)算。然后設(shè)置tableView的estimatedRowHeight屬性弧腥,設(shè)置一個(gè)估計(jì)的高度厦取。(我這里用的代理方法,實(shí)際上都一樣)

原理:

這樣的話管搪,在tableView被創(chuàng)建之后虾攻,系統(tǒng)會(huì)根據(jù)estimatedRowHeight屬性設(shè)置的值,為tableView設(shè)置一個(gè)估計(jì)的值更鲁。然后在Cell顯示的時(shí)候再獲取Cell的高度霎箍,并刷新tableView的contentSize。

  • (void)tableViewConstraints {
    [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.edges.equalTo(self.view);
    }];
    }

  • (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.dataList.count;
    }

  • (MasonryTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MasonryTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:LXZTableViewCellIdentifier];
    [cell reloadViewWithText:self.dataList[indexPath.row]];
    return cell;
    }

// 需要注意的是岁经,這個(gè)代理方法和直接返回當(dāng)前Cell高度的代理方法并不一樣朋沮。
// 這個(gè)代理方法會(huì)將當(dāng)前所有Cell的高度都預(yù)估出來,而不是只計(jì)算顯示的Cell缀壤,所以這種方式對(duì)性能消耗還是很大的。
// 所以通過設(shè)置estimatedRowHeight屬性的方式纠亚,和這種代理方法的方式塘慕,最后性能消耗都是一樣的。

  • (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 50.f;
    }

  • (UITableView *)tableView {
    if (!_tableView) {
    _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
    _tableView.delegate = self;
    _tableView.dataSource = self;
    // 設(shè)置tableView自動(dòng)高度
    _tableView.rowHeight = UITableViewAutomaticDimension;
    [_tableView registerClass:[MasonryTableViewCell class] forCellReuseIdentifier:LXZTableViewCellIdentifier];
    [self.view addSubview:_tableView];
    }
    return _tableView;
    }
    UIScrollView自動(dòng)布局

之前聽很多人說過UIScrollView很麻煩蒂胞,然而我并沒有感覺到有多麻煩(并非裝逼)图呢。我感覺說麻煩的人可能根本就沒試過吧,只是覺得很麻煩而已。

我這里就講一下兩種進(jìn)行UIScrollView自動(dòng)布局的方案蛤织,并且會(huì)講一下自動(dòng)布局的技巧赴叹,只要掌握技巧,布局其實(shí)很簡(jiǎn)單指蚜。

布局小技巧:

給UIScrollView添加的約束是定義其frame乞巧,設(shè)置contentSize是定義其內(nèi)部大小。UIScrollView進(jìn)行addSubview操作摊鸡,都是將其子視圖添加到contentView上绽媒。

所以,添加到UIScrollView上的子視圖免猾,對(duì)UIScrollView添加的約束都是作用于contentView上的是辕。只需要按照這樣的思路給UIScrollView設(shè)置約束,就可以掌握設(shè)置約束的技巧了猎提。

提前設(shè)置contentSize

// 提前設(shè)置好UIScrollView的contentSize获三,并設(shè)置UIScrollView自身的約束
self.scrollView.contentSize = CGSizeMake(1000, 1000);
[self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view);
}];

// 雖然redView的get方法內(nèi)部已經(jīng)執(zhí)行過addSubview操作,但是UIView始終以最后一次添加的父視圖為準(zhǔn)锨苏,也就是redView始終是在最后一次添加的父視圖上疙教。
[self.scrollView addSubview:self.redView];
[self.redView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.top.equalTo(self.scrollView);
make.width.height.mas_equalTo(200);
}];

[self.scrollView addSubview:self.blueView];
[self.blueView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.redView.mas_right);
make.top.equalTo(self.scrollView);
make.width.height.equalTo(self.redView);
}];

[self.scrollView addSubview:self.greenView];
[self.greenView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.scrollView);
make.top.equalTo(self.redView.mas_bottom);
make.width.height.equalTo(self.redView);
}];
自動(dòng)contentSize

上面的例子是提前設(shè)置好UIScrollView的contentSize的內(nèi)部size,然后直接向里面addSubview蚓炬。但是這有個(gè)要求就是松逊,需要提前知道contentSize的大小,不然沒法設(shè)置肯夏。

這個(gè)例子中將會(huì)展示動(dòng)態(tài)改變contentSize的大小经宏,內(nèi)部視圖有多少contentSize就自動(dòng)擴(kuò)充到多大。

這種方式的實(shí)現(xiàn)驯击,主要是依賴于創(chuàng)建一個(gè)containerView內(nèi)容視圖烁兰,并添加到UIScrollView上作為子視圖。UIScrollView原來的子視圖都添加到containerView上徊都,并且和這個(gè)視圖設(shè)置約束沪斟。

因?yàn)閷?duì)UIScrollView進(jìn)行addSubview操作的時(shí)候,本質(zhì)上是往其contentView上添加暇矫。也就是containerView的父視圖是contentView主之,通過containerView撐起contentView視圖的大小,以此來實(shí)現(xiàn)動(dòng)態(tài)改變contentSize李根。

// 在進(jìn)行約束的時(shí)候槽奕,要對(duì)containerView的上下左右都添加和子視圖的約束,以便確認(rèn)containerView的邊界區(qū)域房轿。
[self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view);
}];

CGFloat padding = LXZViewPadding;
[self.containerView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.scrollView).insets(UIEdgeInsetsMake(padding, padding, padding, padding));
}];

[self.containerView addSubview:self.greenView];
[self.greenView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.left.equalTo(self.containerView).offset(padding);
make.size.mas_equalTo(CGSizeMake(250, 250));
}];

[self.containerView addSubview:self.redView];
[self.redView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.containerView).offset(padding);
make.left.equalTo(self.greenView.mas_right).offset(padding);
make.size.equalTo(self.greenView);
make.right.equalTo(self.containerView).offset(-padding);
}];

[self.containerView addSubview:self.yellowView];
[self.yellowView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.containerView).offset(padding);
make.top.equalTo(self.greenView.mas_bottom).offset(padding);
make.size.equalTo(self.greenView);
make.bottom.equalTo(self.containerView).offset(-padding);
}];

多個(gè)(2個(gè)以上)控件的等間隔排序顯示
首先介紹2個(gè)函數(shù)
/**
* axisType 軸線方向
* fixedSpacing 間隔大小
* fixedItemLength 每個(gè)控件的固定長(zhǎng)度/寬度
* leadSpacing 頭部間隔
* tailSpacing 尾部間隔
*
*/
//1. 等間隔排列 - 多個(gè)控件間隔固定粤攒,控件長(zhǎng)度/寬度變化

  • (void)mas_distributeViewsAlongAxis:(MASAxisType)axisType
    withFixedSpacing:(CGFloat)fixedSpacing leadSpacing:(CGFloat)leadSpacing
    tailSpacing:(CGFloat)tailSpacing;

//2. 等間隔排列 - 多個(gè)固定大小固定所森,間隔空隙變化

  • (void)mas_distributeViewsAlongAxis:(MASAxisType)axisType
    withFixedItemLength:(CGFloat)fixedItemLength
    leadSpacing:(CGFloat)leadSpacing
    tailSpacing:(CGFloat)tailSpacing;

//首先添加5個(gè)視圖
NSMutableArray *array = [NSMutableArray new];
for (int i = 0; i < 5; i ++) {
UIView *view = [UIView new];
view.backgroundColor = [UIColor greenColor];
[self addSubview:view];
[array addObject:view]; //保存添加的控件
}

//水平方向控件間隔固定等間隔
[array mas_distributeViewsAlongAxis:MASAxisTypeHorizontal withFixedSpacing:15 leadSpacing:10 tailSpacing:10];
[array makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(50);
make.height.equalTo(70);
}];

//水平方向?qū)挾裙潭ǖ乳g隔
[array mas_distributeViewsAlongAxis:MASAxisTypeHorizontal withFixedItemLength:70 leadSpacing:10 tailSpacing:10];
[array makeConstraints:^(MASConstraintMaker *make) { //數(shù)組額你不必須都是view
make.top.equalTo(50);
make.height.equalTo(70);
}];

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市夯接,隨后出現(xiàn)的幾起案子焕济,更是在濱河造成了極大的恐慌,老刑警劉巖盔几,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晴弃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡问欠,警方通過查閱死者的電腦和手機(jī)肝匆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顺献,“玉大人旗国,你說我怎么就攤上這事∽⒄” “怎么了能曾?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)肿轨。 經(jīng)常有香客問我寿冕,道長(zhǎng),這世上最難降的妖魔是什么椒袍? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任驼唱,我火速辦了婚禮,結(jié)果婚禮上驹暑,老公的妹妹穿的比我還像新娘玫恳。我一直安慰自己,他們只是感情好优俘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布京办。 她就那樣靜靜地躺著,像睡著了一般帆焕。 火紅的嫁衣襯著肌膚如雪惭婿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天叶雹,我揣著相機(jī)與錄音财饥,去河邊找鬼。 笑死折晦,一個(gè)胖子當(dāng)著我的面吹牛佑力,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播筋遭,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了漓滔?” 一聲冷哼從身側(cè)響起编饺,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎响驴,沒想到半個(gè)月后透且,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡豁鲤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年秽誊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琳骡。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锅论,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出楣号,到底是詐尸還是另有隱情最易,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布炫狱,位于F島的核電站藻懒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏视译。R本人自食惡果不足惜嬉荆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酷含。 院中可真熱鬧鄙早,春花似錦、人聲如沸第美。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽什往。三九已至扳缕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間别威,已是汗流浹背躯舔。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留省古,地道東北人粥庄。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像豺妓,于是被迫代替她去往敵國(guó)和親惜互。 傳聞我的和親對(duì)象是個(gè)殘疾皇子布讹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • iOS_autoLayout_Masonry 概述 Masonry是一個(gè)輕量級(jí)的布局框架與更好的包裝AutoLay...
    指尖的跳動(dòng)閱讀 1,162評(píng)論 1 4
  • (一)Masonry介紹 Masonry是一個(gè)輕量級(jí)的布局框架 擁有自己的描述語法 采用更優(yōu)雅的鏈?zhǔn)秸Z法封裝自動(dòng)布...
    木易林1閱讀 2,334評(píng)論 0 3
  • Masonry是一個(gè)輕量級(jí)的布局框架,擁有自己的描述語法训堆,采用更優(yōu)雅的鏈?zhǔn)秸Z法封裝自動(dòng)布局描验,簡(jiǎn)潔明了并具有高可讀性...
    3dcc6cf93bb5閱讀 1,765評(píng)論 0 1
  • Masonry是一個(gè)輕量級(jí)的布局框架,它擁有自己的描述語法(采用更優(yōu)雅的鏈?zhǔn)秸Z法封裝)來自動(dòng)布局坑鱼,具有很好可讀性且...
    AngeloD閱讀 3,300評(píng)論 0 9
  • 來吧且讓我們來相愛膘流,趁你我,尚在人間鲁沥『艄桑——魯米 有一段時(shí)間,我想著要不要擁有一部Kindle画恰,我不知道拿它做什么彭谁,...
    陌上櫻花閱讀 988評(píng)論 1 51