文档章节

在UIScrollView中使用Autolayout布局(2)

法斗斗
 法斗斗
发布于 2015/09/21 16:19
字数 742
阅读 26
收藏 0

 

在UIScrollView中使用Autolayout布局(2) 

分类: iPhone开发2014-12-10 14:49 5358人阅读 评论(5) 收藏 举报


在《在UIScrollView中使用Autolayout布局(1)》中,我们介绍了一个简单的例子,在UIScrollView中加入了2个使用Autolayout布局的控件。

现实的情况当然不止有这么简单。

我们使用UIScrollView,通常是需要在上面放超过一个屏幕size的控件。

如果按照(1)的步骤,添加许多Label、TextField或者其他控件,那情况又会怎么样呢?

你会发现红色的布局错误又会出现,Autolayout布局引擎会警告因为条件不足,因此不能够计算出UIScrollView的contentSize宽度或高度。

 

这是因为我们违反了第一条原则:UIScrollView 的contentSize依赖于subviews

 

大量的subviews使用了Top约束和Leading约束。这些约束都是相对于superview的。而superview是什么?其实就是UIScrollView。

 

这让布局引擎很矛盾,如何计算contentSize呢?要计算contentSize必须清楚每个subviews的frame,而subviews的frame居然又要依赖scrollView?

 

因此计算contentSize的条件不足。

 

你可以不理会这个布局错误而运行程序。但contentSize无法计算的结果,会导致运行时UIScrollView无法滚动。

 

 

因此当你发现UIScrollView无法滚动时,往往是因为我们违反了第一条原则,导致contentSize计算错误。

 

正确的步骤如下:

 

1、        拖入一个UIScrollView。

2、        设置UIScrollView的约束。例如Pin上、下、左、右边距都为0,将导致UIScrollView占据整个视图。

3、        拖入一个UIView,我们不妨将它命名为contentView。约束contentView的宽和高,使他能满足你的布局需要,能够摆放下所有你想摆放下的控件(一般来说都会超过屏幕的大小)。例如:width 等于ViewController’s  view 的width,height等于800。

4、        然后重要的来了,设置UIView的Pin约束,上下左右都为0。Why?明明设置了宽和高了呀,UIScrollView还不能计算出contentSize吗?相信我,如果你不做这一步,我保证你的UIScrollView还是不能滚动。这4个Pin约束实际上是用于告诉UIScrollView:我会把你的内容“撑到”多大。也就是说,contentSize必须根据UIView的4条边来确定,而不是根据别的什么方法来确定。这样,UIScrollView就把contentSize的4条边和UIView的4条边关联起来了。如果UIView的4条变发生变化,则不用你说,UIScrollView会自动调整contentSize。

5、        剩下的事情就无所谓了。随便在这个UIView上布局你的控件吧,它们都能正确布局。例如我们在UIView左上角放了一个Label(约束:top、leading),右下角放了一个Label(约束:bottom、trailing)。当然,这些约束都只是和contentView相关,没有和UIScrollView相关。不然又会导致布局冲突。


本文转载自:

法斗斗
粉丝 23
博文 368
码字总数 17774
作品 0
杨浦
程序员
私信 提问
iOS开发tips-UIScrollView的Autlayout布局

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jianxin160/article/details/57075059 UIScrollViewj尽管继承于UIView,但它是一个相对比较特殊的视图,特别是...

KenshinCui
2017/02/25
0
0
在Storyboard中对UIScrollView使用autolayout自动布局应该注意的地方

尝试在Storyboard中对UIScrollView使用autolayout自动布局,遇到了种种麻烦,记录一下 1、UIScrollView在StoryBoard中的布局 在StoryBoard中使用UIScrollView一定要用下图中的这种布局,如果...

yoyoso
2015/03/23
14.7K
0
AutoLayout自动布局在线课程

AutoLayout是一种基于约束的,描述性的布局系统。AutoLayout为开发者提供了一种不同于以往UI元素位置指定的布局方法。以前布局是通过frame属性来定义其在当前view中的位置和尺寸。使用AutoL...

YungFan
01/12
0
0
UIScrollerView上AutoLayout的总结

像往常一样设置约束设置UIScrollerView,报错如下: 一.查原因如下:我设置UIScrollerView的SubVIews中的控件的约束,是依靠他的SuperView(也就是UIScrollerView),但UIScrollerView的conte...

tb_engineer
2015/11/28
278
0
iOS XIB使用UIScrollView 设置 contentsize 无效

一问题描述 今天做个需求,后台获取多个对象信息,如果某个对象为nil,则不会显示,当有多个返回对象的适合,界面不能容纳所有的元素,废话这么多,总之是在xib 中使用 UIScrollView,但是问题...

卧龙小
2015/08/11
5.4K
0

没有更多内容

加载失败,请刷新页面

加载更多

CRM、DMP、CDP都是什么?有什么区别?

Markter对CRM系统(Customer Relationship Management System,客户关系管理系统),营销自动化等概念都已经比较熟悉,也许DMP(Data Management Platform,数据管理平台)也多多少少有些了解。...

怡海软件-CRM
16分钟前
4
0
中台是什么,到底要解决什么问题?

故事的开始 这个最早由阿里在2015年提出的“大中台,小前台”战略中延伸出来的概念,最近在国内大热。阿里、腾讯、百度、京东、美团、滴滴等一众互联网巨头,从去年到今年,接连开始组织架构...

喵二狸
28分钟前
3
0
Linux Centos 7 - MySQL 5.7离线安装

内部网络通过离线包的方式进行安装。 一、下载 下载地址:https://dev.mysql.com/downloads/mysql/ 进入页面后,点击右侧链接。 下载对应版本。 通过xftp6等工具上传到服务器上。 二、安装和...

华山猛男
28分钟前
3
0
EventBus 3 全解

EventBus 3 全解 [TOC] 使用 一个基于观察者模式的事件发布/订阅框架. 用于模块间通信和解耦, 使用方便,性能高. 基本使用 1. gradle导入依赖库 implementation 'org.greenrobot:eventbus:3....

马湖村第九后羿
31分钟前
4
0
HTTP 协议

什么是HTTP协议? HTTP是hypertext transport protocol的缩写,即超文本传输协议。 是用于万维网服务器与本地浏览器之间传输超文本的传送协议。可以使浏览器更加高效,使网络传输减少。能够保...

彩色泡泡糖
41分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部