UIScrollView 在不同的设备上运行时不会滚动或部分滚动 swift

Posted

技术标签:

【中文标题】UIScrollView 在不同的设备上运行时不会滚动或部分滚动 swift【英文标题】:UIScrollView does not scroll or scrolls partially when running on different device swift 【发布时间】:2016-03-01 16:48:00 【问题描述】:

我用 UIScrollView 创建了一个视图。当我尝试向下滚动时,它在不同设备上的工作方式不同。我发现这是因为设备的屏幕尺寸不同。我正在使用scrollView.contentSize = CGSizeMake(325, scrollView.frame.height) 设置滚动视图高度。

我在尝试为我的问题寻找解决方案时遇到了这个问题

CGRect contentRect = CGRectZero;
for (UIView *view in self.scrollView.subviews) 
    contentRect = CGRectUnion(contentRect, view.frame);

self.scrollView.contentSize = contentRect.size

但这对我不起作用,因为我的滚动视图由许多不同大小和位置的子视图、标签和按钮组成。我在故事板上完成了所有滚动视图的设计,我没有使用自动布局。

我需要获取滚动视图相对于它运行的设备的确切高度。有没有直接简单的方法来实现这一点?如果没有,我想知道我必须做什么才能获得所需的高度。提前致谢!

【问题讨论】:

【参考方案1】:

我认为您将滚动视图的 contentSize 与它的框架/边界混淆了。滚动视图的框架应该与您正在运行的设备屏幕的边界相匹配。 contentSize 应该是“虚拟画布”大小,即你的“许多不同位置的不同大小的子视图、标签和按钮”的大小。这永远不会改变,因为无论设备的实际尺寸是多少,您都希望滚动视图能够滚动以显示所有内容。我会使用自动布局将滚动视图的边缘扩展到其超级视图的边缘。不过,您必须在代码中明确设置 contentSize,不幸的是,在故事板编辑器中无法做到这一点。

【讨论】:

我在情节提要中安排了子视图、按钮和标签。我在代码中完成其余的工作。如您所说,滚动视图与设备的边界匹配。您说 contentSize 永远不应该改变,但 contentSize 在不同的设备中不会保持不变。每次在新设备上构建它时,我都必须更改代码中的 contentSize,否则它不会以所需的方式滚动。 我很困惑。如果您在情节提要中安排控件,那么您应该知道 contentSize 基于此。如果您根据框架的大小在代码中移动它们,那么您应该能够在完成布局后计算出 contentSize。如果您在所有子视图都在滚动视图上之后运行它,那么该代码 sn-p 应该可以工作。它返回了什么,你认为它应该返回什么? 滚动视图的宽度和高度在情节提要上分别为 325 和 800。如果我将内容大小设置为此,当我在 iphone 4s 上构建它时它会正确滚动,而当我在具有更大屏幕尺寸的设备(如 iphone 6 和 6 plus)上运行它时它不起作用。我还检查了 scrollView.frame.height 在不同设备上返回不同的值。它在 iPhone 4s 上返回 712,在 iPhone 6s Plus 上返回 968。 “不起作用”是什么意思?它不滚动?您确定 contentSize 大于 frame.size 吗?这是我能想到滚动视图不会滚动的唯一原因。

以上是关于UIScrollView 在不同的设备上运行时不会滚动或部分滚动 swift的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 框架在 iOS 8 和 iOS 7 上的大小不同

包含旋转的 UIImageView 的 UIScrollView 不会缩放

允许滚动视图的高度根据图像大小而改变

不同版本的 UIScrollView - iOS

UIScrollView 不在设备上滚动

在设备上运行时屏幕不会出现填充屏幕