zoukankan      html  css  js  c++  java
  • 【原】Masonry+UIScrollView的使用注意事项

    【原】Masonry+UIScrollView的使用注意事项

    本文转载请注明出处 —— polobymulberry-博客园

    1.问题描述

    我想实现的使用在一个UIScrollView依次添加三个UITableView(tableView1、tableView2、tableView3)。最后想达到的效果就像下图这样:

    QQ20160110-0@2x

    或者用这张图更形象点:

    QQ20160110-1@2x

    然后我的代码大概的样子

    // 自定义了一个UIScrollView为ICScrollView
    // 在ViewController中添加到self.view中
    // ViewController.m
    - (void)viewDidLoad {
        // ...
        [self.view addSubview:self.scrollView];
        // ...
    }
    
    - (ICScrollView *)scrollView
    {
        // ...
        if (_scrollView == nil) {
            _scrollView = [[ICScrollView alloc] init];
            _scrollView.contentSize = CGSizeMake(width, height);
        }
        // ...
    }
    
    // 然后我在ICScrollView中重载了init函数
    // ICScrollView.m
    - (instancetype)init
    {
        self = [super init];
        if (self) {
            [self addSubview:self.tableView1];
            [self addSubview:self.tableView2];
            [self addSubview:self.tableView3];
            
            [self layoutScrollSubViews];
        }
        return self;
    }
    
    - (void)layoutScrollSubViews
    {
        [self.tableView1 mas_makeConstraints:^(MASConstraintMaker *make) {
            make.size.mas_equalTo(self.size);
            make.leading.mas_equalTo(self.mas_leading);
            make.top.mas_equalTo(self.mas_top);
        }];
        
        [self.tableView2 mas_makeConstraints:^(MASConstraintMaker *make) {
            make.size.mas_equalTo(self.size);
            make.leading.mas_equalTo(self.tableView1.mas_trailing);
            make.top.mas_equalTo(self.mas_top);
        }];
        
        [self.tableView3 mas_makeConstraints:^(MASConstraintMaker *make) {
            make.size.mas_equalTo(self.size);
            make.leading.mas_equalTo(self.tableView2.mas_trailing);
            make.top.mas_equalTo(self.mas_top);
        }];
    }

    上述代码用Masonry给要添加到scrollView上的3个tableView添加了约束。但是当我显示的时候,发现三个tableView确实是初始化了,也添加到scrollView上了,但是宽度和高度均为0。问题就是我约束都设置好了,为什么还会出现问题?

    2.问题分析

    出现使用autolayout后,view的宽高均为0。很可能是因为约束设置出错。搜索了无数文章,尝试了无数可能后,我觉得问题很可能处在scrollView上。所以我搜索autolayout+UIScrollView,还真发现了UIScrollView在Autolayout使用下的一些问题。最主要的问题就是:

    当我使用make.leading.mas_equalTo(self.mas_leading) 的时候,其实这里的self.mas_leading指的是scrollView的contentSize的那个leading。

    有没有发现,此时我的contentSize还没有指定,因为他是我在_scrollView = [[ICScrollView alloc] init]; 后面添加的,而此时约束已经完成了。所以最简单的办法是把_scrollView.contentSize = CGSizeMake(width, height); 放到layoutScrollSubViews之前,就可以啦!具体按照你的代码习惯添加吧。

    3.参考文章

    1. AutoLayout深入浅出三[相遇Scrollview]
    2. UIScrollView 实践经验
  • 相关阅读:
    Spring4 MVC json问题(406 Not Acceptable)
    java 从网络Url中下载文件
    Java基础知识(一) 自增、自减运算符
    java文件读写操作
    java集合运算:求交集,并集,集合差
    httpclient+jsoup实现网页信息抓取
    java web使用gradle配置详情
    关于mysql登录异常处理方法
    windows server 2012 r2 远程桌面连接指南
    Java生成带小图标的二维码-google zxing 工具类
  • 原文地址:https://www.cnblogs.com/polobymulberry/p/5118329.html
Copyright © 2011-2022 走看看