11

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

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

这是在我的 viewDidLoad 中:

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

以下是界面生成器的屏幕截图:

查看层次结构

界面生成器中的滚动视图及其子视图

参考出口

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

运行时的屏幕

4

5 回答 5

23

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

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

以下是有关 UIScrollView 的自动布局支持的一些注意事项:

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

然后,Apple 继续展示如何正确使用UIScrollViewAuto Layout 的示例。

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

在此处输入图像描述

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

于 2014-01-22T04:18:44.880 回答
2

尝试通过以下方式关闭自动布局

ViewController然后选择file inspector 并在interface builder document部分中您可以看到是否Use Autolayout选中。如果它检查,那么uncheck它。

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

于 2014-01-22T04:04:29.047 回答
1

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

首先将您的视图控制器复制并粘贴到 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 代表也快乐编码!!!

于 2014-01-22T04:20:15.117 回答
1

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

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

于 2014-01-22T04:41:08.627 回答
0

我遇到了这个问题,这个线程中的答案都没有奏效。

我在 myUIScrollView等于UIViewController's中设置了我的一个子视图的最高约束view.topAnchor。因此,我UIScrollView不会滚动,因为它会打破约束。

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

于 2020-06-25T21:08:01.013 回答