将 XIB 的 UIScrollView 添加到视图时设置 contentSize
Posted
技术标签:
【中文标题】将 XIB 的 UIScrollView 添加到视图时设置 contentSize【英文标题】:Setting contentSize when adding an XIB's UIScrollView to a view 【发布时间】:2014-11-10 19:49:31 【问题描述】:我使用的是 ios 7.0,Xcode 5.1.1。
在此设置中,我刚刚完成了一个示例,其中有一个故事板,它从 XIB 加载其主视图。我通过删除情节提要中使用视图控制器的场景中的主视图来做到这一点。
在这种情况下,Cocoa 为视图控制器加载了 XIB,结果非常好。
理想情况下,我希望 XIB 中的第一个视图的大小适合显示设备的框架,而 XIB 中的第二个视图是 UIScrollView。
我已经为这个 XIB 关闭了自动布局,所以 scrollView 会真正滚动。
我的 XIB 的第一个视图高度为 568 像素。 scrollView 的高度为 1650 像素。
让我感到困惑的是,我无法将 scrollView 的 contentSize 设置为 1650 并让 scrollView 滚动整个滚动视图。
奇怪的是,我必须这样做:
self.myScrollView.contentSize = CGSizeMake(self.view.frame.size.width,1660 +
(self.view.frame.size.height) * 2);
这是 2796。
如下图所示:
(lldb) po self.myScrollView
UIScrollView: 0x10953e9c0;帧 = (0 64; 320 1650);
(lldb) po self.myScrollView.contentSize (宽度=320,高度=2796)`
知道我在这里破坏了哪一部分的视图魔力吗?
【问题讨论】:
读一读:developer.apple.com/library/ios/technotes/tn2154/_index.html 这有点违反直觉,但都清楚了! 谢谢 Anna,但我只想先让它工作,而不必担心自动布局。不过,如果时间允许,我一定会试试的。 【参考方案1】:更新响应
我对保存滚动视图的 xib 中的设置不是 100% 清楚,但我假设如下:
您有一个屏幕尺寸为 320 x 568 像素的UIView
(致电aView
);
然后您的屏幕上的UIScrollView
大小为 320 x 1650 像素。
然后您将滚动视图添加到aView
,使其成为aView
的唯一子视图。这应该意味着并非所有滚动视图都可见 - 只有前 568 个像素(垂直)。
假设以上,我建议如下:
确保滚动视图的上边缘与aView
齐平。您可能已经这样做了,但值得检查。选择滚动视图,然后转到尺寸检查器,确保除了高度和宽度之外的所有内容都为零
在我的应用程序中使用上述设置,我只需要viewDidLoad
中的以下两行来让滚动视图滚动:
self.sv.frame = CGRectMake(0, 0, 320, 568);
self.sv.contentSize = CGSizeMake(320, 1650);
特别注意滚动视图的frame
的大小,它不是1650
,它是您希望滚动视图在屏幕上占据的大小。
如果我误解了设置,而这不是您想要做的,您应该编辑您的问题以澄清。最后,我注意到您在问题中没有提到的滚动视图的property
是center
属性。 bounds
、frame
和 center
都是相互关联的。尝试记录所有三个。我的猜测是,当您设置框架时,center
会受到影响,这就是为什么您必须对滚动视图的大小进行奇怪的调整。假设滚动视图覆盖整个屏幕,中心应该是(160,284)
- 即frame
的中点。在这种情况下,它不应该是负数。
初始响应
您的问题暗示您在结合使用滚动视图和自动布局时运气不佳:
我已经为这个 XIB 关闭了自动布局,这样滚动视图就会真正滚动。
事实上,滚动视图与自动布局完美兼容,您只需要确保您已经完成了一些事情,并且没有完成其他一些事情。我很欣赏以下步骤为您提出的问题提供了间接而非直接的解决方案,但如果您可以让自动布局/滚动视图设置正常工作,您当前的问题将会消失。
第 1 步。 选择您的视图控制器对象并将其大小设置为 Freeform(Attributes Inspector -> Simulated Metrics -> Size)
第 2 步。制作您的视图控制器,只要它需要保持整个可滚动区域(在您的情况下为 1650)
第 3 步。将滚动视图添加到控制器的view
并使其覆盖整个视图区域。不要添加任何约束,但它的高度也应该是 1650。
第 4 步。使用自动布局将滚动视图的边缘固定到其父视图(不为滚动视图设置任何宽度或高度属性)
第 5 步。为您的滚动视图提供一个内容视图 通常是个好主意,因此在滚动视图中添加一个子视图并使其覆盖整个滚动视图。这是包含可滚动内容(控件、文本等)的视图
第 6 步。以与约束滚动视图相同的方式约束 Content View,但这次,DO 设置明确的高度和宽度(高度应为 1650)
请注意,您在任何时候都不会设置滚动视图contentSize
,也不会为滚动视图指定明确的高度或宽度。 contentSize
值是根据您在第 6 步中在 内容视图 上设置的高度限制为您计算的。
【讨论】:
嗨,保罗。我对滚动视图和自动布局没有运气。当方程一开始没有求解时,它是添加到方程中的另一个变量。我会试试你的建议,谢谢。您对如何在没有自动布局的情况下首先进行这项工作有什么建议吗?我想先从一个简单的案例中理解它。谢谢。 已更新我的答案。如果我对您如何设置 xib 有误,请澄清您的问题。一旦你有,我(和其他人很可能)会再帮忙。 就是这样,保罗。我将不得不仔细看看我是否在某个地方有另一种观点。我确实将 self.myScrollView.frame 设置为 self.view.frame,以使其成为 (0,0,320,568)。您在简单案例中对此进行的测试表明,我的 something 一定是错误的,而这正是我所寻找的。如果我没有得到预期的结果,我会在重做此操作时检查中心属性。再次感谢并感谢您为此花费的时间。以上是关于将 XIB 的 UIScrollView 添加到视图时设置 contentSize的主要内容,如果未能解决你的问题,请参考以下文章
将 XIB 的 UIScrollView 添加到视图时设置 contentSize
Swift 3 - 如何在 .xib 文件上为 UIScrollView 分配委托?
swift - 在UIScrollView上从xib添加UIView后如何更新约束?