AutoLayout 与 UIScrollView的相遇是一个不可避免的场景,像UITableView、UIWebView这些都是继承于UIScrollView的,关于它们的autolayout布局大体一致,但还是会有略微不同,而我们这篇讨论的主要是其contentSize问题,所以就直接讲UIScrollView就OK了。

如上图,我们将view分为3个部分,上面一部分主要用于展示海报或者一些封面图片,中间部分用来展示一些基本的信息,比如商品页面的价格,销量,分类等比较重要的信息,下面用于展示一些额外的信息,比如推荐给用户的一些其它商品或者门店等信息。

我们先按之前讲的来添加一些contraints,看一下UIScrollView里面添加Constraints有什么区别没有。 先依次添加约束:

1.为上面的橙色view与UIImageview添加高度与上下左右的边距约束。
2.然后再添加中间蓝色view及其内容的高度与上下左右边距的约束。
3.再添加UISegment的高度与上下左右边距的约束。
4.再添加底部的UITableView的上下左右边距约束。

我们来看一下IB会怎么处理目前的约束:

Scroll View ,Need constraints for height
Scrollable Content Size Ambiguity, Has ambiguous scrollable content height
Missing Constraints, Need constraints for : width
Scrollable Content Size Ambiguity,Has ambigous content size

全是Scrollview的问题,而且意思基本上就是说IB无法确定ScrollView的宽度与高度,我们知道UIScrollView最重要的就是其contentSize的宽高了,如果这个无法确定,那scrollview就无法知晓可以滚动查看的区域。其实这仅仅是表象,IB不会因为contentSize的可见区域不确定而抱怨,因为它会有一个默认的可见区域就是其bounds,其实IB真正抱怨的是其内部的subViews的布局对于它的依赖,比如我们看最上面的橙色View相对于上、左、右的约束都相对于scrollview的。scrollview内部的subViews的约束全依赖于scrollview,这样子的话,问题就来了,Scrollview和UILabel、UIButton等这些控件一样都会根据内容调整其contentSize(autolayout布局模式中,UILabel这种控件都会根据内容对自身宽高进行调整),如果Scrollview要根据其subviews来调整自身的contentsize,而其subviews又要根据scrollview的contentsize调整自身的布局,是不是就矛盾了,就成了相互依赖了。

所以IB要求UIScrollview(当然包括继承于它的UITableview、UIWebview这些控件)的contentSize必须在布局时能够确定。

由于Scrollview的contentSize由其subviews确定,其subviews的布局依赖于其父视图Scrollview的边界。这个矛盾,要不解决前者问题,要不解决后者,即要么不让UIScrollView的contentSize由其subviews确定,要么就让ScrollView的subviews不依赖其contentSize(即Scrollview的边界)。很显然,我们只能选择后者,因为前者你无法改变,其实从宏观上来看,改变了一个就相当于改变了两个,其实二者并没有什么特别区别,都是同一个问题导致的。

既然我们想好了策略,就来试一下,如何才能让Scrollview的subviews不依赖于其边界呢? 我们首先不考虑subviews的复杂布局情况,我们先把subviews嵌入到一个我们自己添加的ContainerView中,从而把我们的布局任务简化成Scrollview与ContainerView二者的约束关系,所有之前的subviews我们都放在ContainerView中,则subviews的约束就会仅仅依赖于ContainerView了,这些subviews不再与scrollview有直接关系。

我们虽然简化了布局任务,但是还是无法绕过Scrollview的ContentSize的边界确定问题,我们前面已经知道了Scrollview的子视图不能依赖于ScrollView的边界,那我们就让其子视图不依赖于其边界即可。 国外有一个网友在遇到上面的问题的时候就咨询了Apple的工程师,结果他们画了40分钟才给出了解决方案,这说明Scrollview在autolayout中的使用真的不是那么简单。Apple的工程师给出的解决方案就是让我们的ContainerView建立一个与UIScrollview的父视图即我们的main view建立一个Equal Width,Equal Height约束,这样子ContainerView的宽高就不再依赖于ScrollView的边界了,但是ContainerView还是Scrollview的子视图,Scrollview的边界还是没有确定,我们还要为ContainerView添加与ScrollView的边界约束,用以帮忙ScrollView确定边界。

OK,我们建立了ContainerView与mainview的equal width与 equal height后,效果果然就是我们想要的。 关于Autolayout与Scrollview相遇的故事,我们就先讲到这里,关于布局的场景总是像国际象棋一样,有数不尽的步骤与结果,连Machine都可以为之苦恼,所以这里只是通过这么一个示例,让大家对autolayout的布局理念有一个更深入的认识,不要过多的去抓鱼,而要学会如何抓鱼,抓鱼的诀窍是什么,学习一门技术,大家都会有各自的体会与理解,从根本上去掌握技术的原理,以此来应对千变万化的场景才能事半功倍。

本文示例代码:本文Demo

为了更好的理解autolayout的原理,推荐阅读:

Apple工程师如何讲解AutoLayout的?
讲解视频地址:Cocoa AutoLaout Video,找名称为Cocoa Autolayout的那一个视频。

讲稿:Cocoa autolayout PDF

转载于:https://www.cnblogs.com/yulang314/p/5059201.html

在Scrollview中使用AutoLayout相关推荐

  1. scrollview中嵌套listview产生冲突问题

    在scrollview中嵌套listview或者gridview时 如果listview或者gridview的高度时wrap-content会导致两者只显示一行多一点 原因: listview和gri ...

  2. Android之解决在scrollview中嵌套ListView切换界面时scrollview整体向下滑动

    有时候我们在scrollview中会嵌套ListView,在嵌套ListView(ListView上面还有一些控件)后,切换Activity时会发现整个 scrollview 被向下滑动直到ListV ...

  3. [转载]Android: 如何实现ScrollView中含有ListView?

    原文地址:Android: 如何实现ScrollView中含有ListView?作者:mailofzxf ListView本身就含有ScrollView,因此把ListView放到ScrollView ...

  4. ScrollView中的LinearLayout不能使用android:layout_heig...

    2019独角兽企业重金招聘Python工程师标准>>> ScrollView中的LinearLayout不能使用android:layout_height="fill_pa ...

  5. ScrollView中嵌入Listview,当item高度不一样的时候,item展示不全问题

    首先在scrollview中嵌入listview,我们需要动态设置listview的高度,否则只会展示一行. public void fixListViewHeight(ListView listVi ...

  6. ScrollView中使用ListView

    转自 http://blog.csdn.net/fzh0803/article/details/7971391 由于scrollview和listview不能直接共存,在scrollview中直接使用 ...

  7. ScrollView中嵌套recycleView 出现的不显示,显示不全,终极解决方案

    ScrollView中嵌套recycleView 出现的不显示,显示不全,终极解决方案 参考文章: (1)ScrollView中嵌套recycleView 出现的不显示,显示不全,终极解决方案 (2) ...

  8. 使用Xcode 6中的AutoLayout约束模拟方面适合行为

    本文翻译自:Emulating aspect-fit behaviour using AutoLayout constraints in Xcode 6 I want to use AutoLayou ...

  9. ScrollView中嵌套WebView底部留白问题解决

    ScrollView中嵌套WebView出现底部滑动留有大面积空白问题网络上有各种解决方案. 本博文基本上能终结该问题的出现,下面是网络上解决步骤: 1:第一种解决方案也是最多人提到的,在加载完成后重 ...

最新文章

  1. APUE读书笔记-18终端输入输出-14总结
  2. 关于Android adb实现框架和应用
  3. 图结构练习——DFS——判断可达性
  4. 23、HTML图像按钮
  5. padding和卷积的区别_TensorFlow笔记1——20.CNN卷积神经网络padding两种模式SAME和VALID...
  6. 基于Nokia S60的游戏开发之一
  7. [K8S]kubeadm国内镜像安装方式
  8. 诺基亚X71上手评测:中端机市场中的绝对C位
  9. @程序员,区块链开发平台避坑指南!
  10. 备份阿里云数据库到本地数据库
  11. 服务器内存傲腾基本参数信息,单条512GB的傲腾内存你见过嘛?
  12. win10更改C盘下的用户文件夹名
  13. 特斯拉model3中控屏怎么关_特斯拉Model 3为什么取消仪表盘? - 全文
  14. HTML实现文件上传和HTML实现打开文件目录
  15. 光威猛将240固态掉盘开卡教程
  16. Replication进阶(三) 复制心跳详解
  17. 多线程处理Excel导入数据入库
  18. 试题 历届试题 青蛙跳杯子
  19. 经济日报pdf批量下载整合
  20. 持久化技术——游戏玩家信息管理(基于 SQLite)

热门文章

  1. 主动找智能钥匙 PKE取代RKE是大势所趋
  2. 转如何限制文本框只能输入数字,小数点,英文,汉字等各类代码
  3. Android开发学习笔记(10):NDK安装手顺及应用
  4. iPhone socket 编程之BSD Socket篇
  5. 域服务器可以修改ip,Windows Server 2016 域控制器修改IP
  6. redis分布式缓存(二)
  7. Nginx解决跨域问题的具体实现
  8. Dubbo仅仅是一个RPC框架?
  9. 什么是声明式事务控制
  10. 类加载器-启动类加载器