天天看點

ios AutoLayout筆記

autolayout自動适配總是使控件按照布局顯示,不管螢幕尺寸如何變化,例如設定了空間left=10;top=20;width=100;height=100;則不管螢幕如何變化,控件都是按照這個适配顯示,在不同螢幕上,系統總是能通過改變其他沒有設定的選項來校正控件的顯示,如控件view的限制為(10,10,10,10)(上,左,下,右),則在320*480螢幕上,view的寬高為(300,460),在375*667螢幕上為(355,647)。

一個自定義控件,在xib中布局時,一般先固定控件的高寬度,然而這樣在實際不同的螢幕中會出現控件寬度超出螢幕之外或者不能鋪滿螢幕寬度,譬如在xib中設定了控件的寬度為375,則在320螢幕上可能寬度超出了,在414螢幕上不能鋪滿螢幕,是以最好的解決方法是在加載控件時,為其加上限制:

-(void) awakeFromNib{
    [[NSBundle mainBundle] loadNibNamed:@"testview" owner:self options:nil];
    [self addSubview:_bgview];
    [self.bgview mas_makeConstraints:^(MASConstraintMaker *make){
        //上下左右的限制都需要加
        make.right.mas_equalTo(0);
        make.height.mas_equalTo(self.frame.size.height);
        make.left.mas_equalTo(0);
        make.top.mas_equalTo(0);
    }];
}
           

用自動布局有一個好處,即更新一個控件的布局,其他相對于該控件的布局也會相對變化的,如果是代碼布局則會所有相關控件的布局都需要調整。在自動布局中如果不用xib或者sb,那麼可以用masonry架構。

用 masonry架構還可以做動畫

[UIView animateWithDuration:2 animations:^{
        [self.redVi mas_updateConstraints:^(MASConstraintMaker *make) {
            make.height.mas_equalTo(200);
        }];
        [self.redVi.superview layoutIfNeeded];//強制繪制
    }];
           

在xib或者sb中布局的空間如果想通過代碼(例如frame)來修改控件的位置時,必須先設定translatesAutoresizingMaskIntoConstraints為YES,然後再設定相關frame

在布局時如果在xib或者sb中對控件進行布局,如果想對該控件用masonry進行動畫(更新相關的限制),必須先移除原先的相關布局(譬如sb,xib中控件的高度設為128,如果想做動畫改變其高度到200的話,就必須先将128這個設定移除或者降低這個限制的級别,這樣masonry做的動畫才能實作,如果開始就是masonry布局的話,沒有這種情況),原因大概是masonry布局的限制在masonry架構中做了标記。

在sb或者xib中适配處于同一行的控件時,一般這樣适配,假如兩控件的寬度一緻,則

ios AutoLayout筆記

對于兩個或者三個處于同一行的控件,如果寬度比例不知道的話,例如

ios AutoLayout筆記

雖然兩控件上下左右的已經适配,但是當螢幕比例發生變化時,系統無法知道兩控件的寬度比例怎樣配置設定,是以對于這樣的處于同一行的控件,至少得知道一個控件的寬度,或者控件等寬

自動布局scrollview的适配一般很愛出問題,因為scrollview的contentview的高寬度是根據其裡面的控件決定的,但是contentview中的控件的适配又是依賴于contentview,是以對于scrollview的适配一般在scrollview裡面添加一個uiview,并且固定它的寬高或者使其上下左右居中,隻要能使scrollview能确定它的contentview,例如:

ios AutoLayout筆記

如果想在代碼中改變scrollview的滾動範圍,則可以在脫線view的高度限制,在代碼中更改,例如

ios AutoLayout筆記

其中經測試self.bgViewCon.constant=1200;在viewDidLoad,viewdidappear,viewwillappear中更改都行,不一定非要在updateviewconstraints中更改