UiScrollView 高度不正确(没有 AutoConstraint)

Posted

技术标签:

【中文标题】UiScrollView 高度不正确(没有 AutoConstraint)【英文标题】:UiScrollView Incorrect Height (Without AutoConstraint) 【发布时间】:2016-07-14 13:50:58 【问题描述】:

在堆栈溢出方面进行了很多搜索,但没有找到任何适合我们的解决方案。

我们有几个视图和UILabelsUIButtons UIScrollView 格式如下。单击按钮时,我们隐藏了几个视图和标签并尝试重新计算UIScollView 高度。

UIScrollView

-->UIView

-->UIView2

-->UIView3

-->UILabel1

-->UILabel2 (请注意这些标签不在UIView 内,它们直接添加到scrollview。这是正确的方法还是应该将它们添加到UIView 内? )

-->UITextField(直接添加到scrollview)

-->UITextField1(直接添加到scrollview)

-->UIButton(点击textfields上方的按钮,标签根据业务逻辑隐藏或显示)

当我们尝试在UIButton 上重置UIScrollview 的大小时,单击它不会正确计算高度。在堆栈溢出中尝试了以下由许多答案共享的解决方案

    标签和按钮直接添加到UIScrollView有问题吗? 有没有更好的方法来正确设置UIScrollview 的高度?

    我们不想使用AutoConstraint

     CGRect contentRect = CGRectZero;for (UIView *view in uiScrollViewObj.subviews) 
        contentRect = CGRectUnion(contentRect, view.frame);
    
    uiScrollViewObj.contentSize = contentRect.size;
    

【问题讨论】:

你是想改变内部内容的高度,还是滚动视图本身的高度? 改变uiScrollView的高度 uiScrollViewObj.contentSize 改变了可以滚动的内部区域的大小,并且不改变scrollview的高度,你必须改变scrollview的frame。 让我试试。有没有可以分享的例子 这是我在获取内容大小后尝试的方法.. 没有奏效。现在我什至无法滚动 uiScollviewObj.frame = CGRectMake(10, 20, viewWidth, contentRect.size.height); 【参考方案1】:
    不,不是,实际上 UILabel 和 UIButton 是 UIView。 我认为您混淆了两个概念。 UIScrollView 高度是视口的高度(滚动视图的可见部分)。您要更改的是 contentSize 高度,即您要滚动的整个内容的高度(我不知道我是否解释清楚)。

如果结构是你说的那样,那么 UIButton 是最接近按钮的元素,你应该移动它的框架并将它放在上面,否则 contentSize 总是一样的。

除此之外,您的代码正在遍历滚动视图的所有视图,这些视图不仅是您添加的视图,还有 Apple 插入的视图。

【讨论】:

感谢您的回复。我想过手动做,但认为可能有简单的方法来实现这一点,但我错过了。我试试看 因此问题已通过手动循环遍历所有子视图元素并设置 contentSize 来解决。感谢您的回复【参考方案2】:

动态计算 contentsize 的最佳方法是将滚动视图子视图的 y 位置和它们的高度相加。像这样的东西应该可以工作:

CGFloat viewY, maxY=0;
for (UIView *view in uiScrollViewObj.subviews) 
    if (view.hidden) continue;
    viewY = view.frame.origin.y + view.frame.size.height;
    maxY = (viewY > maxY) ? viewY : maxY;

[uiScrollViewObj setContentSize:CGSizeMake(uiScrollViewObj.frame.size.width, maxY)];

【讨论】:

感谢您的回复。尝试了上面的代码,如果我们隐藏视图,它不会降低高度。下面有额外的滚动 编辑了上面的代码以不包括隐藏的视图。现在不应出现额外的滚动条。 因此问题已通过手动循环遍历所有子视图元素并设置 contentSize 来解决。感谢您的回复。我很困惑为什么你给出的解决方案不起作用。这说得通。 uiScollView 有 bug 吗? 嗯,这正是上面代码所做的,循环遍历子视图并设置 contentSize。无论如何,很高兴您找到了解决方案! :)

以上是关于UiScrollView 高度不正确(没有 AutoConstraint)的主要内容,如果未能解决你的问题,请参考以下文章

如何正确设置 UIScrollView 高度

UIScrollView ContentView动态高度约束

动态检测 UIScrollView 的高度

Swift如何获得UIScrollView动态高度

如何使用不同高度的 UISCrollView 分页?

垂直布局的小型设备上的高度不正确? [关闭]