UIScrollViews 子视图没有在纵向到横向方向更改上调整自己的大小

Posted

技术标签:

【中文标题】UIScrollViews 子视图没有在纵向到横向方向更改上调整自己的大小【英文标题】:UIScrollViews subviews not resizing themselves on Portrait to Landscape Orientation Change 【发布时间】:2014-01-09 10:16:04 【问题描述】:

在我的应用程序中,我有一个层次结构,如主视图 -> UIScrollView -> UISearchBar。搜索栏覆盖整个屏幕宽度。但是当它切换到横向时,滚动视图会根据横向调整自身并覆盖整个屏幕,但它的子视图(如 UISearchBar 宽度)与纵向相同。另外,我正在使用 Autolayout,并且在情节提要中正确设置了它们的约束(前导和尾随、宽度(大于等于 320)等)。

我也知道在 SO 中有几个答案,但几乎每个人都说在 willAutororate 中再次设置宽度。但是我在 UIScrollview 中有大约 15 个子视图,我认为这些子视图无法以编程方式设置(如增加 LOC),而且我认为 Autolayout 必须有一些解决方案。

【问题讨论】:

我会解释它,但我认为这家伙比我做得更好。 codehappily.wordpress.com/2013/11/14/… 不过,如果要设置子视图的约束,可以在子视图上运行 for-in 循环。 【参考方案1】:

滚动视图不能很好地配合约束。这是一种使用约束和 Interface Builder 的方法,该方法对我来说具有 vertically 滚动滚动视图,不需要任何手动或内容大小调整并适用于旋转:

使用约束定位的视图控制器中的滚动视图 一个容器 (UIView),它是滚动视图的 子视图,其位置带有将每个边缘固定到父视图的约束 改为将所有其他子视图添加到容器视图中。使用约束。超过scrollview的高度以获得垂直滚动的scrollview。

但是有一个技巧可以让旋转调整大小自动工作:

您必须向容器视图添加一个附加约束,以使其宽度与UIScrollview的宽度相匹配。很奇怪,您必须这样做,因为将每一侧固定到滚动视图应该可以解决问题,但是如果您不添加额外的约束,它将无法与旋转一起使用。

这就是我的意思:

【讨论】:

同样的方法可以用于水平滚动scrollviews。只需为高度而不是宽度添加额外的约束,然后添加您的子视图以超过宽度以水平滚动。【参考方案2】:

试试这个: 此问题将通过仅约束解决。我创建了一个项目并通过使用正确的约束它对我来说很好

这里我将一一向您展示如何添加正确的约束:

    仅像屏幕截图中那样添加滚动视图并为滚动视图添加约束:

2. now add search bar and add constraints for search bar too, 
here below you can find out complete constraints for scrollview and search together:

【讨论】:

它工作正常。我忘了输入水平居中对齐。谢谢【参考方案3】:

您可以使用子视图的 UIViewAutoresizing 掩码(autoresizingMask 属性)。

【讨论】:

您是否尝试将 autoresizingMask = UIViewAutoresizingFlexibleWidth 设置为,即您的搜索栏?

以上是关于UIScrollViews 子视图没有在纵向到横向方向更改上调整自己的大小的主要内容,如果未能解决你的问题,请参考以下文章

在 iPhone 中将视图从纵向切换到横向,就像 iPhone 中的计算器一样

UIPageViewController 作为子视图,横向双页,纵向单页

在仅纵向应用程序中以横向模式添加子视图

ipad:横向和纵向方向的问题

当我在 iOS7 的 iPad 中将视图从纵向旋转到横向或反之亦然时,UITextfield shouldChangeCharactersInRange 没有调用

当视图从纵向更改为横向时,方向不会改变