IOS開發(fā)中利用Masonry自動布局ScrollView

Masonry是我們平時做開發(fā)中用的比較多的自動布局庫争剿,對于普通的視圖布局,一般其都很容易實現(xiàn),但對于ScrollView序苏,UITableView以及UICollectionView這種滾動視圖,則需要一些技巧

UITableView自動(手動)混合計算高度這邊文章中捷凄,介紹過如何對UITableView進行自動布局忱详,其主要注意這么幾點:

要求

  1. tableView外部設置:
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 44;
  1. 子View布局需要放置在Cell的contentView上面
  2. 子view負責支撐起contentView的大小
    如代碼:
     [self.contentView addSubview:_contentLabel];
     [self.contentView addSubview:_headerImage];
        // 約束可以直接放在創(chuàng)建的地方
        // 不要放在layoutSubviews 或 updateConstraints方法里
        [_headerImage mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.equalTo(self.contentView).offset(10);
            make.top.equalTo(self.contentView).offset(20);
            make.height.width.equalTo(@50);
        }];
        
        [_contentLabel mas_updateConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(_headerImage.mas_bottom).offset(5);
            make.left.right.equalTo(self.contentView);
            // 這一步是關鍵 讓cell知道最底部在哪兒, 然后算出自身高度
            make.bottom.equalTo(self.contentView);
        }];

比較關鍵的一步是垂直方向從上到下,最后一個視圖的bottom要設置的和contentView的大小一致跺涤,這樣才能達到自動布局的效果匈睁。

因為tableView的cell自帶了contentView這個視圖,其大小和cell的大小一樣桶错,所以我們只需要想辦法支撐起contentView的高度即可達到自動布局的效果航唆,但對于ScrollView,其并沒有為我們提供contentView院刁,那要如何自動布局呢糯钙?

我們平時在使用UIScrollView的時候, 必須得給一個固定的contentsize才能實現(xiàn)滾動效果退腥,那是因為UIScrollview內(nèi)部實現(xiàn)原理是依托于已知contentsize去實現(xiàn)的超营,具體可以文獻3中的scrollView原理。在使用masonry為scrollview布局時阅虫,需要在其上自定義add一個contentView子容器視圖演闭,通過這個子視圖的尺寸去撐起scrollview,這樣scrollview就有了具體的contentsize颓帝。

//布局scrollview
   UIScrollView  *myScrollView = [[UIScrollView alloc] init];
    [self.view addSubview:myScrollView];
    myScrollView.backgroundColor = [UIColor whiteColor];
    [myScrollView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.mas_equalTo(strongSelf.view);
    }];
//布局contentView
    contentView = [[UIView alloc] init];
    [myScrollView addSubview:contentView];
    contentView.backgroundColor = [UIColor whiteColor];
    [contentView mas_makeConstraints:^(MASConstraintMaker *make) {
        //注意點1
        make.edges.mas_equalTo(myScrollView);
      //垂直方向米碰,寬度必須指定
        make.width.mas_equalTo(myScrollView);
    }];

這里注意的點:

  1. contentView相對scrollView的布局設置必須給出明確的說明窝革,如注意點1,這里設置的是和scrollView的大小一致
  2. 必須給出明確的寬度吕座,且要大于0虐译,否則不能展示。
  3. 子視圖可以參照tableView自動布局吴趴,只要支撐起contentView的高度即可漆诽。

案例

利用Masonry來實現(xiàn)一個自動布局的滾動視圖

效果如下:


滾動效果.gif
//創(chuàng)建ScrollView
    self.mainScrollView = [[UIScrollView alloc] init];
    [self.view addSubview:self.mainScrollView];
    [self.mainScrollView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(self.view);
    }];
    UIView *contentView = [[UIView alloc] init];
    contentView.backgroundColor = [UIColor whiteColor];
    [self.mainScrollView addSubview:contentView];
//創(chuàng)建子容器
 [contentView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.mainScrollView).inset(15.f);
        make.left.equalTo(self.mainScrollView).inset(15.f);
        make.right.equalTo(self.mainScrollView).inset(15.f);
        make.width.mas_equalTo(self.view.bounds.size.width - 30.f);
        make.bottom.equalTo(self.mainScrollView).inset(15.f);
        make.height.greaterThanOrEqualTo(@0);
    }];
  //生成View
    NSMutableArray *labelViews = [NSMutableArray arrayWithCapacity:1];
    for (int i = 0; i < 20; i++) {
        UILabel *label = [[UILabel alloc] init];
        label.textAlignment = NSTextAlignmentCenter;
        label.textColor = [self RandomColor];
        label.backgroundColor = [self getRandomBackgroundColor];
        label.text = [NSString stringWithFormat:@"我是Label,索引值為:%d",i+1];
        label.font = [UIFont boldSystemFontOfSize:16.f];
        [contentView addSubview:label];
        [labelViews addObject:label];
    }
    //布局子視圖
    UILabel *prev = nil;
    for (int i = 0; i < labelViews.count; i++) {
        if (!prev) {
            [labelViews[i] mas_makeConstraints:^(MASConstraintMaker *make) {
                make.top.left.right.equalTo(contentView);
                make.height.mas_equalTo(100);
            }];
        } else {
            [labelViews[i] mas_makeConstraints:^(MASConstraintMaker *make) {
                make.top.equalTo(prev.mas_bottom);
                make.left.right.equalTo(prev);
                make.height.mas_equalTo(100);
                if (i == labelViews.count - 1) {
                    make.bottom.equalTo(contentView.mas_bottom);
                }
            }];
        }
        prev = labelViews[i];
    }

demo地址:https://github.com/UCliwenbin/MasonryForScrollView.git


參考文檔

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锣枝,隨后出現(xiàn)的幾起案子厢拭,更是在濱河造成了極大的恐慌,老刑警劉巖撇叁,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件供鸠,死亡現(xiàn)場離奇詭異,居然都是意外死亡陨闹,警方通過查閱死者的電腦和手機楞捂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趋厉,“玉大人寨闹,你說我怎么就攤上這事【耍” “怎么了鼻忠?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長杈绸。 經(jīng)常有香客問我帖蔓,道長,這世上最難降的妖魔是什么瞳脓? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任塑娇,我火速辦了婚禮,結(jié)果婚禮上劫侧,老公的妹妹穿的比我還像新娘埋酬。我一直安慰自己,他們只是感情好烧栋,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布写妥。 她就那樣靜靜地躺著,像睡著了一般审姓。 火紅的嫁衣襯著肌膚如雪珍特。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天魔吐,我揣著相機與錄音扎筒,去河邊找鬼莱找。 笑死,一個胖子當著我的面吹牛嗜桌,可吹牛的內(nèi)容都是我干的奥溺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼骨宠,長吁一口氣:“原來是場噩夢啊……” “哼浮定!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起层亿,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤桦卒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后棕所,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闸盔,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡悯辙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年琳省,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躲撰。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡针贬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拢蛋,到底是詐尸還是另有隱情桦他,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布谆棱,位于F島的核電站快压,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏垃瞧。R本人自食惡果不足惜蔫劣,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望个从。 院中可真熱鬧脉幢,春花似錦、人聲如沸嗦锐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奕污。三九已至萎羔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碳默,已是汗流浹背外驱。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工育灸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昵宇。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓磅崭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瓦哎。 傳聞我的和親對象是個殘疾皇子砸喻,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353