ScrollView使用Masonry自動(dòng)布局

我們將UIScrollView和他的子視圖之間的約束分為下面三類:

1、間距類約束:子視圖和父視圖之間,上,左,下,右,四個(gè)方向的間距。
2、寬高類約束:子視圖與父視圖的寬高比。
3、居中類約束:子視圖在父視圖上水平居中或者垂直居中。

約束的理解

在自動(dòng)布局中,所有的間距類約束,并非相對(duì)于父視圖本身的,而是相對(duì)于父視圖的內(nèi)容視圖的(eg, UIScrollView的contentSize),由于一般的UIView的內(nèi)容視圖與自身的大小一樣,所以可以當(dāng)做是相對(duì)于它自身,而UIScrollView在加載時(shí),會(huì)根據(jù)內(nèi)部子視圖計(jì)算contentSize的值。

遇到的問題

1、在xib或者storyboard的中,直接添加一個(gè)子視圖的間距約束為UIScrollView的視圖時(shí)會(huì)報(bào)錯(cuò)。原因就是子視圖的frame依賴了scrollView的contentSize,而contentSize的值又要根據(jù)子控件的frame來計(jì)算,那到底該怎樣?所以會(huì)xcode無法識(shí)別了。

解決辦法:可以添加參照的contentView,網(wǎng)上的做法比較多。不再重復(fù)。

2、使用Masonry,時(shí)也一樣,會(huì)造成scrollView不能滑動(dòng)等各種問題。

解決辦法:跟xib或者storyboard一樣。

使用Masonry,不使用參照view的做法,代碼片段是我項(xiàng)目中使用的。

1、創(chuàng)建子視圖,self.topView~self.topView3中就包含一張圖片:

- (void)configSubviews {
    [self.view addSubview:self.scrollView];
    [self.scrollView addSubview:self.topView];
    [self.scrollView addSubview:self.topView1];
    [self.scrollView addSubview:self.topView2];
    [self.scrollView addSubview:self.topView3];

}

2、添加約束

- (void)configLayoutSubviews {
    
    [self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(self.view);
        make.bottom.equalTo(self.topView3).offset(0);
    }];
    
    [self.topView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.and.right.equalTo(self.view);
        make.top.equalTo(self.scrollView);
        CGFloat h = (SCREENWIDTH-30.0)*(204.0/345.0)+26.0;
        make.height.equalTo(@(h));
    }];
    
    [self.topView1 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.and.right.equalTo(self.view);
        make.top.equalTo(self.topView.mas_bottom).with.offset(50);
        CGFloat h = (SCREENWIDTH-30.0)*(204.0/345.0)+26.0;
        make.height.equalTo(@(h));
    }];
    
    [self.topView2 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.and.right.equalTo(self.view);
        make.top.equalTo(self.topView1.mas_bottom).with.offset(50);
        CGFloat h = (SCREENWIDTH-30.0)*(204.0/345.0)+26.0;
        make.height.equalTo(@(h));
    }];
    
    [self.topView3 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.and.right.equalTo(self.view);
        make.top.equalTo(self.topView2.mas_bottom).with.offset(50);
        CGFloat h = (SCREENWIDTH-30.0)*(204.0/345.0)+26.0;
        make.height.equalTo(@(h));
    }];
}

3、scrollview的約束添加

    [self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(self.view);
        make.bottom.equalTo(self.topView3).offset(0);
    }];

說明:
一個(gè)是edges約束,設(shè)置為何self.view四邊間距相等;
一個(gè)是bottom約束,設(shè)置scrollView的bottom約束等于self.topView3(最下面的一個(gè)子視圖)的bottom。

4、scrollview最上面的子視圖的約束添加

    [self.topView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.and.right.equalTo(self.view);
        make.top.equalTo(self.scrollView);
        CGFloat h = (SCREENWIDTH-30.0)*(204.0/345.0)+26.0;
        make.height.equalTo(@(h));
    }];

說明:

make.left.and.right.equalTo(self.view); 這里scrollView是垂直方向滾動(dòng),所以設(shè)置第一個(gè)子視圖的左右約束于self.view(可以是別的view)的左右約束相等,切記不能設(shè)置成和scrollView的約束相等。
make.top.equalTo(self.scrollView); 最頂部的子視圖的top約束和scrollView相等,切記不能設(shè)置為self.view,不然scrollView無法滾動(dòng)。

5、最后按照一般View的添加約束的方法。直到最后一個(gè)view(這里是self.topView3)添加完成。

寫在最后

以前看見在scrollView上使用約束添加子視圖很頭疼,看完這篇,再也不暈了。。歡迎批評(píng)指正,大神勿噴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容