【问题标题】:UIScrollView not scrolling regardless of large contentSize无论内容大小如何,UIScrollView 都不会滚动
【发布时间】:2014-02-11 23:01:31
【问题描述】:

我在 Interface Builder 中创建了一个 UIScrollView 并为其添加了子视图,但我无法让它滚动。我看过其他类似的问题,但我已经适当地设置了我的 contentSize。事实上,我什至尝试过设置非常大的 contentSize,但它没有产生任何影响。我错过了什么?注意 UIScrollView 是一个 IBOutlet:

@property (strong, nonatomic) IBOutlet UIScrollView *scroll;

这是在我看来DidLoad:

self.scroll.scrollEnabled = YES;
[self.scroll setContentSize: CGSizeMake(2400,8000)];

这是来自 Interface Builder 的屏幕截图:

这是运行时的视图,但在任何点进行水平或垂直滚动​​的任何尝试都不起作用。

【问题讨论】:

  • 您是否已将IBOutlet 链接到情节提要?
  • 我相信是的。我添加了引用插座的屏幕截图。我也试过self.scroll.backgroundColor = [UIColor redColor];,它工作正常,所以我相信一切都正确链接。
  • 能否在设置 setContentSize 之前设置框架?只是为了尝试。
  • 我应该将框架设置为什么?
  • 小于您的 ContentSize 的任何内容。

标签: ios objective-c uiscrollview contentsize


【解决方案1】:

关闭自动布局可以,但这不是解决方案。如果你真的需要Auto Layout,那就使用它,如果你不需要它,把它关掉。但这不是此解决方案的正确解决方案。

UIScrollView 与自动布局中的其他视图的工作方式不同。这是关于自动布局的Apple's release note,我复制了有趣的部分(强调我的,在第三个要点):

以下是有关 UIScrollView 的自动布局支持的一些说明:

  • 通常,自动布局将视图的顶部、左侧、底部和右侧边缘视为可见边缘。也就是说,如果您将视图固定到 它的超级视图的左边缘,你真的把它固定在 超级视图边界的最小 x 值。更改边界原点 父视图的位置不会改变视图的位置。
  • UIScrollView 类通过更改其边界的原点来滚动其内容。为了使这项工作与自动布局一起使用,顶部、左侧、底部、 滚动视图中的右边缘现在意味着其内容的边缘 查看。
  • 对滚动视图的子视图的约束必须导致要填充的大小,然后将其解释为 滚动视图。 (这不应与 用于自动布局的 intrinsicContentSize 方法。)调整滚动的大小 具有自动布局的视图框架,约束必须是显式的 关于滚动视图的宽度和高度,或 滚动视图必须绑定到其子树之外的视图。
  • 请注意,您可以通过创建约束使滚动视图的子视图看起来浮动(不滚动)在其他滚动内容之上 在视图和滚动视图的子树之外的视图之间,例如 滚动视图的超级视图。

Apple 接着展示了如何正确使用 UIScrollView 和 Auto Layout 的示例。

作为一般规则,最简单的解决方法之一是在元素到 UIScrollView 底部之间创建一个约束。因此,在您希望位于 UIScrollView 底部的元素中,创建此底部空间约束:

再一次,如果您不想使用自动布局,请将其关闭。然后您可以按照通常的方式设置contentSize。但你应该明白,这是 Auto Layout 的预期行为。

【讨论】:

  • 我仍然对它以前不滚动的原因感到困惑,但我了解“纯自动布局”方法的工作原理,所以我想我会使用它而不是简单地禁用自动布局。非常感谢!
  • 我的猜测是,以前没有任何限制可以说“内容至少需要这么多!”,并且编译器忽略了您的 setContentSize: 调用,因为它只是在查看您的约束来查看滚动视图中有多少内容。
  • 我有一个非常相似的问题。我试图创建一个文本字段的滚动视图,这些文本字段会增长并滚动以保留在屏幕上。设置底部约束解决了我的问题!
【解决方案2】:

尝试通过

关闭自动布局

选择ViewController,然后选择file inspector,在interface builder document部分你可以看到Use Autolayout是否被选中。如果选中,则uncheck它。

此信息UIScrollView And Autolayout 可能会提供详细信息。

【讨论】:

  • 谢谢,这解决了滚动问题,但正如@EnricoSusatyo 所说,似乎可以在不禁用自动布局的情况下解决它。
【解决方案3】:

试试这个代码来自动设置内容大小

首先将视图控制器复制并粘贴到 viewDidLoad 方法中

 [self MHAutoContentSizeForScrollViewWithPadding:10 scrl:YOUR_SCROLLVIEW];

然后复制粘贴到下面的viewDidLoad方法中

-(void)MHAutoContentSizeForScrollViewWithPadding:(CGFloat)padding scrl:(UIScrollView*)view{
    if ([view isKindOfClass:[UIScrollView class]]) {
        CGRect rect = CGRectZero;
        for(UIView * view in YOUR_SCROLLVIEW.subviews){
            rect = CGRectUnion(rect, view.frame);
        }
        [YOUR_SCROLLVIEW setContentSize:CGSizeMake(rect.size.width, rect.size.height+padding)];
    } else {
        NSLog(@"You can only set the ContentSize for ScrollViews");
    }
}

同时连接 YOUR_SCROLLVIEW 委托和 TextFeild 委托 快乐编码!!!

【讨论】:

    【解决方案4】:

    如果您使用自动布局,则将 UIScrollView 中的所有内容放入另一个 UIView,并将该 UIView 作为 UIScrollView 的唯一子项。然后就可以使用 AutoLayout。

    如果接近尾端的事情搞砸了(无论你的 UIScrollView 滚动哪个方向的尾端),请将最后的约束更改为尽可能低的优先级。

    【讨论】:

      【解决方案5】:

      我遇到了这个问题,这个帖子中的答案都没有。

      我已将我的UIScrollView 中的一个子视图的最高约束设置为等于UIViewControllerview.topAnchor。因此,我的 UIScrollView 不会滚动,因为它会破坏约束。

      一旦我修改了约束并将其设置为等于我的UIScrollView.topAnchor,它就会按预期工作。

      【讨论】:

        猜你喜欢
        • 2017-10-27
        • 2019-11-23
        • 1970-01-01
        • 2023-03-12
        • 2011-11-02
        • 2012-10-07
        • 2018-05-03
        • 1970-01-01
        • 2016-05-27
        相关资源
        最近更新 更多