iOS Masonry 要點(diǎn)

iOS Masonry 更新要點(diǎn)

1.更新方法

AutoLayout方法 方法說(shuō)明
setNeedsLayout 告知頁(yè)面需要更新纸肉,不會(huì)立即更新,執(zhí)行后會(huì)調(diào)用,loyoutSubviews
layoutIfNeeded 告知頁(yè)面布局立即更新翘瓮,一般會(huì)和setNeedsLayout一起使用
layoutSubviews 系統(tǒng)重寫(xiě)布局
setNeedsUpdateConstraints 告知需要更新約束器贩,不會(huì)立即執(zhí)行
updateConstraintsIfNeeded 告知立刻更新約束
updateConstraints 系統(tǒng)更新約束

2.設(shè)置全局 宏

  • define MAS_SHORTHAND_GLOBALS 使用全局宏定義,可以使equalTo等效于mas_equalTo

  • define MAS_SHORTHAND 使用全局宏定義, 可以在調(diào)用masonry方法的時(shí)候不使用mas_前綴

3.基本使用

  • mas_makeConstraints:添加約束
  • mas_updateConstraints:更新約束宠漩、亦可添加新約束
  • mas_remakeConstraints:重置之前的約束

4.重要屬性

  • multipler屬性表示約束值為約束對(duì)象的乘因數(shù)
  • dividedBy屬性表示約束值為約束對(duì)象的除因數(shù),可用于設(shè)置view的寬高比
  • priorityLow()設(shè)置約束優(yōu)先級(jí)
  • baseline NSLayoutAttributeBaseline 文本基線
[self.topView addSubview:self.topInnerView];
   [self.topInnerView mas_makeConstraints:^(MASConstraintMaker *make) {
       make.height.equalTo(self.topView.mas_height).dividedBy(3);
       make.width.and.height.lessThanOrEqualTo(self.topView);
       make.width.and.height.equalTo(self.topView).with.priorityLow();
       make.center.equalTo(self.topView);
   }];

5.新方法:2個(gè)或2個(gè)以上的控件等間隔排序

/**
 *  多個(gè)控件固定間隔的等間隔排列懊直,變化的是控件的長(zhǎng)度或者寬度值
 *
 *  @param axisType        軸線方向
 *  @param fixedSpacing    間隔大小
 *  @param leadSpacing     頭部間隔
 *  @param tailSpacing     尾部間隔
 */
- (void)mas_distributeViewsAlongAxis:(MASAxisType)axisType 
                   withFixedSpacing:(CGFloat)fixedSpacing l
                         eadSpacing:(CGFloat)leadSpacing 
                        tailSpacing:(CGFloat)tailSpacing;
/**
 *  多個(gè)固定大小的控件的等間隔排列,變化的是間隔的空隙
 *
 *  @param axisType        軸線方向
 *  @param fixedItemLength 每個(gè)控件的固定長(zhǎng)度或者寬度值
 *  @param leadSpacing     頭部間隔
 *  @param tailSpacing     尾部間隔
 */
- (void)mas_distributeViewsAlongAxis:(MASAxisType)axisType 
                withFixedItemLength:(CGFloat)fixedItemLength 
                        leadSpacing:(CGFloat)leadSpacing 
                        tailSpacing:(CGFloat)tailSpacing;
                        ```
                        ```
使用方法很簡(jiǎn)單扒吁,因?yàn)樗荖SArray的類(lèi)擴(kuò)展:
//  創(chuàng)建水平排列圖標(biāo) arr中放置了2個(gè)或連個(gè)以上的初始化后的控件
//  alongAxis 軸線方向   固定間隔     頭部間隔      尾部間隔
[arr mas_distributeViewsAlongAxis:MASAxisTypeHorizontal withFixedSpacing:20 leadSpacing:5 tailSpacing:5];
[arr makeConstraints:^(MASConstraintMaker *make) {
      make.top.equalTo(@60);
      make.height.equalTo(@60);
}];

6.使用動(dòng)畫(huà)更新約束

如果想要約束變換之后實(shí)現(xiàn)動(dòng)畫(huà)效果,則需要執(zhí)行如下操作
// 通知需要更新約束室囊,但是不立即執(zhí)行
[self setNeedsUpdateConstraints];
// 立即更新約束雕崩,以執(zhí)行動(dòng)態(tài)變換
// update constraints now so we can animate the change
[self updateConstraintsIfNeeded];
// 執(zhí)行動(dòng)畫(huà)效果, 設(shè)置動(dòng)畫(huà)時(shí)間
[UIView animateWithDuration:0.4 animations:^{
     [self layoutIfNeeded];
}];

7.多行Label 適配

preferredMaxLayoutWidth: 多行l(wèi)abel的約束問(wèn)題
// 已經(jīng)確認(rèn)好了位置
// 在layoutSubviews中確認(rèn)label的preferredMaxLayoutWidth值
- (void)layoutSubviews {
    [super layoutSubviews];
    // 你必須在 [super layoutSubviews] 調(diào)用之后,longLabel的frame有值之后設(shè)置preferredMaxLayoutWidth
    self.longLabel.preferredMaxLayoutWidth = self.frame.size.width-100;
    // 設(shè)置preferredLayoutWidth后融撞,需要重新布局
    [super layoutSubviews];
}

8.scrollview適配

scrollView使用約束的問(wèn)題:原理通過(guò)一個(gè)contentView來(lái)約束scrollView的contentSize大小盼铁,也就是說(shuō)以子控件的約束條件,來(lái)控制父視圖的大小
// 1. 控制scrollView大谐①恕(顯示區(qū)域)
[self.scrollView makeConstraints:^(MASConstraintMaker *make) {
     make.edges.equalTo(self.view);
}];
// 2. 添加一個(gè)contentView到scrollView饶火,并且添加好約束條件
[contentView makeConstraints:^(MASConstraintMaker *make) {
     make.edges.equalTo(self.scrollView);
     // 注意到此處的寬度約束條件,這個(gè)寬度的約束條件是比添加項(xiàng)
     make.width.equalTo(self.scrollView);
}];
// 3. 對(duì)contentView的子控件做好約束致扯,達(dá)到可以控制contentView的大小

9.自動(dòng)計(jì)算UITableviewCell高度

推薦使用一個(gè)庫(kù)UITableView-FDTemplateLayoutCell
想法:動(dòng)態(tài)高度的cell, 主要關(guān)注的點(diǎn)是什么肤寝?
viewController本身不需要知道cell的類(lèi)型
cell的高度與viewController沒(méi)有相關(guān)性,cell的高度由cell本身來(lái)決定
viewController真正做到的是一個(gè)
以下是摘抄過(guò)來(lái)的
主要是UILabel的高度會(huì)有變化抖僵,所以這里主要是說(shuō)說(shuō)label變化時(shí)如何處理鲤看,設(shè)置UILabel的時(shí)候注意要設(shè)置 preferredMaxLayoutWidth這個(gè)寬度,還有ContentHuggingPriority為 UILayoutPriorityRequried

CGFloat maxWidth = [UIScreen mainScreen].bounds.size.width - 10 * 2;

textLabel = [UILabel new];
textLabel.numberOfLines = 0;
textLabel.preferredMaxLayoutWidth = maxWidth;
[self.contentView addSubview:textLabel];

[textLabel mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.equalTo(statusView.mas_bottom).with.offset(10);
    make.left.equalTo(self.contentView).with.offset(10);
    make.right.equalTo(self.contentView).with.offset(-10);
    make.bottom.equalTo(self.contentView).with.offset(-10);
}];

[_contentLabel setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];
如果版本支持最低版本為iOS 8以上的話可以直接利用UITableViewAutomaticDimension在tableview的heightForRowAtIndexPath直接返回即可耍群。

tableView.rowHeight = UITableViewAutomaticDimension;
tableView.estimatedRowHeight = 80; //減少第一次計(jì)算量义桂,iOS7后支持

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    // 只用返回這個(gè)!
    return UITableViewAutomaticDimension;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蹈垢,一起剝皮案震驚了整個(gè)濱河市慷吊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌曹抬,老刑警劉巖溉瓶,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡嚷闭,警方通過(guò)查閱死者的電腦和手機(jī)攒岛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)胞锰,“玉大人灾锯,你說(shuō)我怎么就攤上這事⌒衢牛” “怎么了顺饮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)凌那。 經(jīng)常有香客問(wèn)我兼雄,道長(zhǎng),這世上最難降的妖魔是什么帽蝶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任赦肋,我火速辦了婚禮,結(jié)果婚禮上励稳,老公的妹妹穿的比我還像新娘佃乘。我一直安慰自己,他們只是感情好驹尼,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布趣避。 她就那樣靜靜地躺著,像睡著了一般新翎。 火紅的嫁衣襯著肌膚如雪程帕。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天地啰,我揣著相機(jī)與錄音愁拭,去河邊找鬼。 笑死髓绽,一個(gè)胖子當(dāng)著我的面吹牛敛苇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播顺呕,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼括饶!你這毒婦竟也來(lái)了株茶?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤图焰,失蹤者是張志新(化名)和其女友劉穎启盛,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡僵闯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年卧抗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鳖粟。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡社裆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出向图,到底是詐尸還是另有隱情泳秀,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布榄攀,位于F島的核電站嗜傅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏檩赢。R本人自食惡果不足惜吕嘀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贞瞒。 院中可真熱鬧偶房,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至拍冠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間簇抵,已是汗流浹背庆杜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碟摆,地道東北人晃财。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像典蜕,于是被迫代替她去往敵國(guó)和親断盛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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

  • iOS Masonry的使用需要注意的地方 自動(dòng)布局最重要的是約束:UI元素間關(guān)系的數(shù)學(xué)表達(dá)式愉舔。約束包括尺寸钢猛、由優(yōu)...
    HeartPower閱讀 10,689評(píng)論 12 15
  • Masonry簡(jiǎn)介 http://www.reibang.com/p/e3162f3c61faMasonry是一個(gè)...
    你好哈嘍哈嘍閱讀 344評(píng)論 0 0
  • Masonry簡(jiǎn)介 Masonry是一個(gè)輕量級(jí)的布局框架,它擁有自己的描述語(yǔ)法(采用更優(yōu)雅的鏈?zhǔn)秸Z(yǔ)法封裝)來(lái)自動(dòng)布...
    下雨天愛(ài)喝咖啡的熊閱讀 1,199評(píng)論 0 5
  • 昨天是15年以來(lái)最憤怒的一天轩缤,下午和趙先生到新家進(jìn)行第三次大掃除命迈,然后等著接收家電贩绕。等到六點(diǎn)依然沒(méi)有人跟我們聯(lián)系,...
    叮當(dāng)寶閱讀 197評(píng)論 0 1
  • 2月份時(shí)候做的題目壶愤,沒(méi)想到半年過(guò)去了感覺(jué)還在淑倾。 幾乎是一遍過(guò),唯一花了一點(diǎn)時(shí)間在想的就是start <= end ...
    98Future閱讀 687評(píng)論 0 0