【问题标题】:UIScrollView content size fixed to 600x600(Main.storyboard size)UIScrollView 内容大小固定为 600x600(Main.storyboard 大小)
【发布时间】:2015-02-18 06:10:15
【问题描述】:

过去 2 周以来我一直面临这个问题,但尚未找到解决方案。

我在存在问题的应用程序中使用 UIScrollview。 通常在我的应用程序中,有不同大小的动态文本和图像将来自网络服务。例如,想象一下 Facebook 新闻源。我的应用程序类似于 Facebook 新闻源。有时,只会有文字,有时会有文字和图像。还有那个帖子的 cmets。

正如我在许多链接中看到的那样,我遵循的层次结构是 SuperView-->UIScrollView-->Content View 并且元素放置在该内容视图中。我将 contentview 中元素的约束分配给 Superview(ContentView --- 约束 -- SuperView)。当视图中的内容超过父视图的大小时,它必须滚动。但是滚动视图的内容大小限制为 600x600 的大小,即在 main.storyboard 中,当我们设计为 W any x H any 大小时。我看过很多教程并搜索了很多网站。但是跟随他们没有运气。

任何帮助都是可观的。

【问题讨论】:

  • 我认为自动布局与滚动视图的内容大小无关。相反,它只处理给定 UI 元素的滚动视图的框架。对于内容大小,可以在运行时更改要显示的内容。

标签: ios objective-c uiscrollview autolayout


【解决方案1】:

这里是如何在 Interface Builder 中从头开始设置与 Auto Layout 一起使用的滚动视图。

  1. 从一个新的 ViewController 开始。拖出一个滚动视图,使其填充视图。取消勾选 Constrain to margins 并将此 scrollView 的左、上、右和下边缘约束到其父视图的左、上、右和底部,偏移量为 0。这允许 scollView 填充任何设备上任何方向的屏幕。如果你愿意,你可以让你的 scrollView 占用更少的屏幕,只要确保它是完全约束的。

  2. 将视图添加到您的滚动视图。这应该是您的 scrollView 上唯一的顶级视图,它将用作您的 contentView。

  3. 将此 contentView 的左、上、右和下边缘约束到 scrollView 的左、上、右和底部,偏移量为 0。此时,您将看到有关内容大小不明确的警告.那是因为你还没有告诉它你的内容视图有多大。

  4. 要调整 contentView 的大小,请向 contentView 添加宽度和高度约束。如果想让它滚动,宽度和高度必须大于scrollView本身的宽度和高度。如果只想垂直滚动,请将 contentView 的宽度设置为等于 scrollView 的宽度。为此,在 Document Outline 视图中,control-从 contentView 拖动到 scrollView 并从弹出窗口中选择 Equal Widths

  5. 如果您希望能够从代码更改 contentView 的高度(以考虑动态内容),首先通过 control 为您的 contentView 创建一个高度约束 - 在contentView 并从弹出窗口中选择 Height。通过 control 从高度约束(在 Document Outline 视图中找到)拖动到 ViewController 的代码,为高度约束创建一个IBOutlet。给插座起一个名字,比如scrollViewHeight,然后当你需要改变scrollView的高度时,用scrollViewHeight.constant = 2000这样的值设置高度。

【讨论】:

  • 你能更简单地解释一下第五点吗?可能是我一直在寻找的答案@vacawama
【解决方案2】:

只需将您的 UIScrollView 添加到情节提要中的 UIViewController 的视图中,并在界面构建器中添加适当的约束。

然后,在代码中构建您的内容视图并为其提供您想要的任何框架,现在开始将您的控件添加到此内容视图并计算每个控件的大小(尤其是高度),最后您就有了总数控件的高度。

现在设置内容视图的框架以匹配该高度并将其作为子视图添加到滚动视图中,然后在代码中设置内容大小,如下所示:

_scrollView.contentSize = contentView.frame.size;

另一个注意,对 viewDidLayoutSubviews 中的尺寸进行此更改以避免任何不同屏幕尺寸的问题,但要小心,此事件被多次调用,因此有一个 BOOL 或其他东西来确保创建视图的代码并添加它对滚动视图执行一次,例如像这样

- (void)viewDidLayoutSubviews {
     [super viewDidLayoutSubviews];
     if (! built) {
         // Do everything I explained above here

        built = YES;
        [self.view layoutSubviews];
     }
}

【讨论】:

  • 我正在使用自动布局,在我的屏幕上可能只有文本或文本和图像或文本以及带有 2 - 5 个动态选项的问题。还有一个tableview。
  • 添加到内容视图中的内容无关紧要,只要保持这些控件的总高度,我告诉你的就行了
猜你喜欢
  • 1970-01-01
  • 2012-02-17
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
  • 2011-11-11
  • 2021-10-23
相关资源
最近更新 更多