ios - 将 XIB 的 UIScrollView 添加到 View 时设置 contentSize

标签 ios uiscrollview

我在 iOS 7.0,Xcode 5.1.1。

在这个设置中,我刚刚完成了一个示例,其中有一个 Storyboard,它从 XIB 加载其主视图。我通过删除 Storyboard 中使用 View Controller 的场景中的主视图来做到这一点。

在这种情况下,Cocoa 为 View Controller 加载了 XIB,结果非常好。

理想情况下,我希望 XIB 中的第一个 View 的大小适合显示设备的框架,而 XIB 中的第二个 View 是 UIScrollView。

我已经为这个 XIB 关闭了 Auto Layout,这样 scrollView 就会真正滚动。

我的 XIB 的第一个 View 高度为 568 像素。 scrollView 的高度为 1650 像素。

令我困惑的是,我无法将 scrollView 的 contentSize 设置为 1650 并使 scrollView 滚动整个 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)`

关于我在这里破坏的 View 魔力的哪一部分有任何想法吗?

最佳答案

更新的回复

我对保存 ScrollView 的 xib 中的设置不是 100% 清楚,但我假设如下:

  • 你有一个UIView (调用 aView )屏幕尺寸为 320 x 568 像素;
  • 然后你有一个UIScrollView屏幕上的尺寸为 320 x 1650 像素。
  • 然后您将 ScrollView 添加到 aView所以它是 aView 的唯一 subview .这应该意味着并不是所有的 ScrollView 都是可见的——只有前 568 个像素(垂直)。

  • 假设上述情况,我建议以下内容:
  • 确保 ScrollView 的上边缘与 aView 齐平。 .您可能已经这样做了,但值得检查。选择 ScrollView ,然后转到尺寸检查器,确保除了高度和宽度之外的所有内容都为零
  • 在具有上述设置的应用程序中,我只需要 viewDidLoad 中的以下两行让 ScrollView 滚动:
     self.sv.frame = CGRectMake(0, 0, 320, 568);
     self.sv.contentSize = CGSizeMake(320, 1650); 
    

    特别注意 frame 的大小。 ScrollView ,它不是 1650 ,这是您希望 ScrollView 在屏幕上占据的大小。

  • 如果我误解了设置,而这不是您想要做的,您应该编辑您的问题以澄清。最后,我注意到 property您在问题中没有提到的 ScrollView 是 center属性(property)。 bounds , frame , 和 center都是相互关联的。尝试记录所有三个。我的猜测是,当您设置框架时,center受到影响,这就是为什么您必须对 ScrollView 的大小进行奇怪的调整。假设 ScrollView 覆盖整个屏幕,中心应该是(160,284) - 即 frame 的中点.在这种情况下,它不应该是负面的。

    初步 react

    您的问题意味着您将 ScrollView 与自动布局结合使用时运气不佳:

    我已经为这个 XIB 关闭了 Auto Layout,这样 scrollView 就会真正滚动。

    事实上, ScrollView 与自动布局完美兼容,您只需要确保您已经完成了几件事,未完成 其他几件事。我很欣赏以下步骤为您提出的问题提供了间接而非直接的解决方案,但如果您可以获得自动布局/ ScrollView 设置,您当前的问题将消失。

    第一步 .
    选择您的 View Controller 对象并将其大小设置为 Freeform (Attributes Inspector -> Simulated Metrics -> Size)

    第二步 .制作您的 View Controller ,只要它需要保持整个可滚动区域(在您的情况下为 1650)

    第三步 .将 ScrollView 添加到 Controller 的 view并使其覆盖整个 View 区域。不要添加任何约束,但它的高度也应该是 1650。

    第 4 步 .使用 Auto Layout 将 ScrollView 的边缘固定到其父 View (执行 NOT 为 ScrollView 设置任何宽度或高度属性)

    第五步 .给你的 ScrollView 一个内容 View 通常是个好主意,所以在 ScrollView 中添加一个 subview View ,让它覆盖整个 ScrollView 。这是包含可滚动内容(控件、文本等)的 View

    第6步 .以与约束 ScrollView 相同的方式约束内容 View ,但这次是 设置明确的高度和宽度(高度应为 1650)

    请注意,您在任何时候都没有设置 ScrollView contentSize ,而且你也没有给你的 ScrollView 一个明确的高度或宽度。 contentSize值是根据您在第 6 步中在内容 View 上设置的高度限制为您计算的。

    关于ios - 将 XIB 的 UIScrollView 添加到 View 时设置 contentSize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26851814/

    相关文章:

    iphone - 在 UIScrollView 中缩放 UIImageView 越界

    ios - UIScrollView:仅在允许时滚动

    ios - 设置 ViewController 的 managedObjectContext

    ios - 弗兰克设置给出错误,

    swift - 无法正确隐藏到 UINavigationBar

    ios - 缩放用于在 IOS 中调整和裁剪图像的 uiscrollview 时出现问题

    ios - 在 iPad 上使用 Touch ID 登录多用户应用程序

    ios - 更新 NSManagedObject 导致 NSFetchedResultsController 删除

    ios - NSURLConnection 的进度条

    ios - 同一屏幕上包含两个表格 View 的 ScrollView 限制垂直滚动