Autolayout与ScrollView的恩怨情仇

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Autolayout与ScrollView的恩怨情仇相关的知识,希望对你有一定的参考价值。

前几天在gitHub看到了一篇文章,传送门在这里:

https://github.com/nixzhu/dev-blog/blob/master/autolayout-tips.md

这里面清楚的说了autolayout与scrollview怎么操作。还有一个demo

原文中有这么一句话:

因为 UILabel 在 UIScrollView 内的 contentView 上,虽然看起来 UIScrollView 很宽很大,但其 contentView 并不是。相反,contentView 的 Size 是由其中的 Subview 的约束所确定的。

这就是你在同时使用 AutoLayout 和 UIScrollView 时所唯一需要明白的地方。

 原来的例子中是用的一个uilabel做实验,而且uilabel标题不为空,这点很重要,为什么说这点很重要呢,是因为标题不为空的话是有一个默认的size。所以你只需要设置top ,rigth,bottom ,left就可以了。这样就就不会报错了。见下图。

技术分享

现在重点来了,新建一个viewcontroller,在view中插入一个uiscrollview 设置其约束,并设置个背景色,见下图

技术分享

运行之后如图:

技术分享

很简单。没什么好说的

现在我在上面加了一个uiimageview,iamgeview没有,然后添加top rigth bottom left约束。依然报错。如图:

技术分享

 

所以,这时候我们给uiiamgeview加个图,这时候不报错了。

技术分享

并运行之:

技术分享

可以看到这时候这个图大到炸天,因为我们没有加size约束 ,所以是默认的约束,这时候,我们就给它加个size约束。如下图:

技术分享

并运行之:这时候效果差不多是我们想要的了:(注意这时候不能滚动)

技术分享

所以,现在我所做的工作,确定了uiimageview的大小,以及位置。还通过right以及bottom约束确定了scrollview的contentSize大小。这时候通过计算,contetnSize小于等于scrollView的frame所以不用滚动。想让他们滚动怎么办?只需要设置right和bottom大小大于scrollviewView的fram可视范围就可以了。现在我们改下right,bottom约束如下图:

技术分享

这时候修改之前及修改之后视图并没有发生变化,因为这只是contentSize大小改变,并使scrollView有了滚动效果,运行:

技术分享

可以看到这时候可以滚动了。所以scrollView滚原理大致如此。

多个view也同样,只要scrollview通过它的子视图的大小和位置能确定contentSize大小就可以了。

所以现在我们重新修改下,让uiviewimage居中。并且right为1000,bottom为1000

运行结果大致是这样的

技术分享

最后在来一个复杂点的布局uiiamgeview左侧上侧各有一个uilabel,大小我没设置,根据适应文字,uiimage距离左侧label距离100,距离上侧uilabel100,

uiimageview的right bottom都是666,现在另好约束然后update如下图。

技术分享

现在我们运行,看结果:

技术分享

没错这结果正是想要的。。

打印frame及contenSize看看如图:

技术分享

 

 contentSize大小为1338.5 1014.5

对于1338.5 = 0(左侧uilabel的left)+332.5(左侧uilabel的宽度,根据内容自适应的宽度)+100(uilabel和uiimageview的距离)+240(uiimageview的宽度)+666(uiimageivew的right)

所以高度为为什么是1014.5,各位应该会算了吧?

 

以上是关于Autolayout与ScrollView的恩怨情仇的主要内容,如果未能解决你的问题,请参考以下文章

storyBoard方式ScrollView的AutoLayout

如何在 Xcode 6.3 中使用 AutoLayout 创建 ScrollView

如何在StoryBoardxib上使用AutoLayout+ScrollView

Autolayout 使 ScrollView 中的 ImageView 无法滚动

text AutoLayout ScrollView

如何使用AutoLayout(iOS / Xamarin.iOS)使ScrollView适合其内容?