无论大型contentSize如何,UIScrollView都不会滚动

时间:2014-01-22 03:24:55

标签: ios objective-c uiscrollview contentsize

我已经在Interface Builder中创建了一个UIScrollView并添加了子视图,但是我无法滚动它。我看过其他类似的问题,但我已经适当地设置了我的contentSize。事实上,我甚至尝试过设置令人难以置信的大型内容,但它无法发挥作用。我错过了什么?请注意,UIScrollView是一个IBOutlet:

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

这是在我的viewDidLoad:

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

以下是Interface Builder的截图:

view heirarchy

scrollview and its subviews in interface builder

referencing outlet

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

screen while running

5 个答案:

答案 0 :(得分:23)

关闭自动布局,但不是解决方案。如果您确实需要自动布局,请使用它,如果您不需要,请将其关闭。但这不是解决方案的正确方法。

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

  

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

     
      
  • 通常,“自动布局”会将视图的顶部,左侧,底部和右侧边缘视为可见边缘。也就是说,如果您将视图固定到   它的超级视图的左边缘,你真的把它钉在了它上面   superview边界的最小x值。更改边界原点   superview不会改变视图的位置。
  •   
  • UIScrollView类通过更改其边界的原点来滚动其内容。要使用Auto Layout,顶部,左侧,底部,   滚动视图中的右边缘现在表示其内容的边缘   图。
  •   
  • 滚动视图子视图的约束必须导致填充大小,然后将其解释为内容大小   滚动视图。 (这不应该与...混淆   用于自动布局的intrinsicContentSize方法。)调整滚动的大小   使用自动布局查看框架时,约束必须是显式的   关于滚动视图的宽度和高度,或者滚动视图的边缘   滚动视图必须绑定到其子树之外的视图。
  •   
  • 请注意,您可以通过创建约束使滚动视图的子视图显示为浮动(不滚动)其他滚动内容   在视图和滚动视图的子树之外的视图之间,例如   滚动视图的超级视图。
  •   
然后,Apple继续展示如何正确使用UIScrollView与自动布局。

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

enter image description here

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

答案 1 :(得分:2)

尝试按

关闭autolayot

选择ViewController然后file inspecto r,在interface builder document部分,您可以看到Use Autolayout是否已选中。如果已选中,则uncheck

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

答案 2 :(得分: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委托 快乐的编码!!!

答案 3 :(得分:1)

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

如果接近结尾处的事情搞砸了(UIScrollView滚动的方向结束),请更改末尾的约束以获得最低优先级。

答案 4 :(得分:0)

我遇到了这个问题,该线程中的所有答案都无效。

我在UIScrollView内的一个子视图中设置了一个最高约束,该约束等于UIViewController的{​​{1}}。因此,我的view.topAnchor无法滚动,因为它将打破约束。

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