Masonry使用需注意事項

一、viewController的屬性edgesForExtendedLayout

如果我們使用masonry晃听,這個屬性的設(shè)置會非常方便的幫助我們解決計算偏移量的問題铐维。

1.edgesForExtendedLayout是一個類型為UIExtendedEdge的屬性懈词,指定邊緣要延伸的方向楔绞。默認是UIRectEdgeAll结闸,四周邊緣均延伸,從iOS7開始
如果即使視圖中上有navigationBar酒朵,下有tabBar桦锄,那么視圖仍會延伸覆蓋到四周的區(qū)域。

2.假設(shè)在有navigation bar和tabbar的情況下:
該屬性設(shè)置為UIRectEdgeBottom;那么就會self.view.frame是從navigationBar下面開始計算一直到屏幕底部蔫耽;
該屬性設(shè)置為UIRectEdgeTop;那么就會self.view.frame是從navigationBar上面計算面開始計算一直到屏幕tabBar上部结耀;
該屬性設(shè)置為UIRectEdgeNone;那么就會self.view.frame是從navigationBar下面開始計算一直到屏幕tabBar上部;

3.iOS7以上系統(tǒng),self.navigationController.navigationBar.translucent默認為YES图甜,self.view.frame.origin.y從0開始(屏幕最上部)碍粥。此時若是添加代碼self.edgesForExtendedLayout = UIRectEdgeNone(iOS7.0以后方法);self.view.frame.origin.y會下移64像素至navBar下方開始。

#define kIOSVersion ((float)[[[UIDevice currentDevice] systemVersion] doubleValue])

在viewController中使用

  if (kIOSVersion >= 7.0) {

       self.automaticallyAdjustsScrollViewInsets = NO;
       self.edgesForExtendedLayout = UIRectEdgeNone;

  }

二黑毅、multipliedBy()嚼摩、dividedBy()比例

使用multipliedBy必須是對同一個控件本身,比如博肋,上面的代碼中低斋,我們都是對bottomInnerView.mas_width本身的蜂厅,如果修改成相對于其它控件匪凡,會出問題。
dividedBy(3);可以不是

三掘猿、AutoLayout關(guān)于更新的幾個方法的區(qū)別

setNeedsLayout:告知頁面需要更新病游,但是不會立刻開始更新。執(zhí)行后會立刻調(diào)用layoutSubviews稠通。
layoutIfNeeded:告知頁面布局立刻更新衬衬。所以一般都會和setNeedsLayout一起使用。如果希望立刻生成新的frame需要調(diào)用此方法改橘,利用這點一般布局動畫可以在更新布局后直接使用這個方法讓動畫生效滋尉。
layoutSubviews:系統(tǒng)重寫布局
setNeedsUpdateConstraints:告知需要更新約束,但是不會立刻開始
updateConstraintsIfNeeded:告知立刻更新約束
updateConstraints:系統(tǒng)更新約束

四飞主、Masonry使用注意事項

用mas_makeConstraints的那個view需要在addSubview之后才能用這個方法
mas_equalTo適用數(shù)值元素狮惜,equalTo適合多屬性的比如make.left.and.right.equalTo(self.view)
方法and和with只是為了可讀性,返回自身碌识,比如make.left.and.right.equalTo(self.view)和make.left.right.equalTo(self.view)是一樣的碾篡。
因為iOS中原點在左上角所以注意使用offset時注意right和bottom用負數(shù)。

五筏餐、重寫updateViewConstraints方法

 - (void)updateViewConstraints 

ViewController的View在更新視圖布局時开泽,會先調(diào)用ViewController的updateViewConstraints 方法。我們可以通過重寫這個方法去更新當前View的內(nèi)部布局魁瞪,而不用再繼承這個View去重寫-updateConstraints方法穆律。我們在重寫這個方法時,務(wù)必要調(diào)用 super 或者 調(diào)用當前View的 -updateConstraints 方法导俘。

#import "ZYXSixViewController.h"

@interface ZYXSixViewController ()

@property (nonatomic, strong) UIButton * yellowButton;
@property (nonatomic, assign) BOOL buttonClicked;

@end

@implementation ZYXSixViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self p_setupViews];
}


- (void)p_setupViews
{
    self.buttonClicked = NO;
    //實例1
    UIButton * yellowButton = [UIButton buttonWithType:UIButtonTypeCustom];
    yellowButton.backgroundColor = [UIColor yellowColor];
    [yellowButton setTitle:@"點擊尺寸改變" forState:UIControlStateNormal];
    [yellowButton setTitleColor:[UIColor blackColor] forState:
     UIControlStateNormal];
    yellowButton.layer.cornerRadius = 5;
    [self.view addSubview:yellowButton];
    self.yellowButton = yellowButton;
    [yellowButton mas_makeConstraints:^(MASConstraintMaker *make) {
        make.size.mas_equalTo(CGSizeMake(100, 100));
        make.center.equalTo(self.view);
    }];
    [yellowButton addTarget:self action:@selector(yellowButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
    
}

- (void)yellowButtonClicked:(UIButton *)sender{
    
    self.buttonClicked = !self.buttonClicked;
    
    // 告訴self.view約束需要更新
    [self.view setNeedsUpdateConstraints];
    // 調(diào)用此方法告訴self.view檢測是否需要更新約束众旗,若需要則更新,下面添加動畫效果才起作用
    [self.view updateConstraintsIfNeeded];
    
    [UIView animateWithDuration:1 animations:^{
         // 告知頁面布局立刻更新
        [self.view layoutIfNeeded];
    }];
    
    
}


- (void)updateViewConstraints
{
    // 這里使用update也是一樣的趟畏。
    // remake會將之前的全部移除贡歧,然后重新添加
    __weak __typeof(self) weakSelf = self;
    [self.yellowButton mas_remakeConstraints:^(MASConstraintMaker *make) {
        
        if (weakSelf.buttonClicked) {
            make.top.bottom.mas_equalTo(0);
            make.left.right.mas_equalTo(0);
        }else{
            make.size.mas_equalTo(CGSizeMake(100, 100));
            make.center.equalTo(self.view);
        }
        
    }];
    [super updateViewConstraints];
    
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子利朵,更是在濱河造成了極大的恐慌律想,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绍弟,死亡現(xiàn)場離奇詭異技即,居然都是意外死亡,警方通過查閱死者的電腦和手機樟遣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門而叼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人豹悬,你說我怎么就攤上這事葵陵。” “怎么了瞻佛?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵脱篙,是天一觀的道長。 經(jīng)常有香客問我伤柄,道長绊困,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任适刀,我火速辦了婚禮秤朗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘笔喉。我一直安慰自己取视,他們只是感情好,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布然遏。 她就那樣靜靜地躺著贫途,像睡著了一般。 火紅的嫁衣襯著肌膚如雪待侵。 梳的紋絲不亂的頭發(fā)上丢早,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機與錄音秧倾,去河邊找鬼怨酝。 笑死,一個胖子當著我的面吹牛那先,可吹牛的內(nèi)容都是我干的农猬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼售淡,長吁一口氣:“原來是場噩夢啊……” “哼斤葱!你這毒婦竟也來了慷垮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤揍堕,失蹤者是張志新(化名)和其女友劉穎料身,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衩茸,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡芹血,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了楞慈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幔烛。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖囊蓝,靈堂內(nèi)的尸體忽然破棺而出饿悬,到底是詐尸還是另有隱情,我是刑警寧澤慎颗,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布乡恕,位于F島的核電站言询,受9級特大地震影響俯萎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜运杭,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一夫啊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辆憔,春花似錦撇眯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至腕巡,卻和暖如春玄坦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绘沉。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工煎楣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人车伞。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓择懂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親另玖。 傳聞我的和親對象是個殘疾皇子困曙,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

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