2014-01-22 177 views
10

我已经创建了一个UIScrollView并在界面生成器中添加了它的子视图,但我无法让它滚动。我看过其他类似的问题,但我已经适当地设置了我的contentSize。实际上,我甚至尝试设置令人难以置信的大容量内容,但它没有发挥作用。我错过了什么?需要注意的是,UIScrollView的是一个IBOutlet:UIScrollView无法滚动,无论大contentSize

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

这是我viewDidLoad中:

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

下面是截图,从界面生成器:

view heirarchy

scrollview and its subviews in interface builder

referencing outlet

这里是同时运行的观点,但在水平或垂直滚动​​的任何企图在任何时候不工作。

screen while running

+2

你把'IBOutlet'连接到故事板了吗? – tia

+0

我相信如此。我添加了引用插座的屏幕截图。我也尝试'self.scroll.backgroundColor = [UIColor redColor];'它工作正常,所以我相信一切正确链接。 – golddove

+0

可否请在设置setContentSize之前设置框架?只是一个尝试。 –

回答

23

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

UIScrollView在自动布局等意见的工作方式不同。这里是Apple's release note上自动布局,我已经复制了有趣的一点(重点煤矿,在第三点):

下面是关于对UIScrollView的自动布局支持的一些注意事项:

  • 一般情况下,自动布局将视图的顶部,左侧,底部和右侧边缘视为可见边缘。也就是说,如果您将其视图的顶视图的左边缘设置为 ,那么您确实将其视为超级视图界限的最小x值的 。更改超级视图的边界原点 不会更改视图的位置。
  • UIScrollView类通过更改其边界的原点来滚动其内容。要使用“自动布局”进行此项工作,滚动视图中的顶部,左侧,底部和右侧边缘现在意味着其内容的边缘 视图。
  • 上滚动视图的子视图的约束必须导致尺寸以填充,然​​后将其解释为 滚动视图的内容的大小。 (这不应与用于自动布局的intrinsicContentSize方法相混淆。)要使用自动布局调整视图的框架大小,约束条件必须是关于滚动视图的宽度和高度的明确的 ,或者滚动视图的边缘必须绑定到其子视图之外的视图。
  • 请注意,您可以滚动视图的子视图出现通过创建约束 视图和滚动视图的子树外的视图之间,如 滚动视图的上海华浮动(不滚动)比其他滚动内容。

苹果然后继续显示例如如何正确使用UIScrollView与自动布局。

作为一般规则,最简单的方法之一是在元素与UIScrollView底部之间创建一个约束。再次

enter image description here

,如果你不想使用自动布局,然后将其关闭:那么,你想在UIScrollView的底部的元素,创建这个底部空间限制。然后,您可以通过常规方式设置contentSize。但是你应该明白的是,这是自动布局的预期行为。

+1

我仍然困惑为什么它以前不滚动,但我明白“纯自动布局”方法是如何工作的,所以我想我会使用它而不是简单地禁用自动布局。非常感谢你! – golddove

+1

我的猜测是,之前并没有任何限制来说“内容至少需要这么多!”,而编译器忽略了你的'setContentSize:'调用,因为它只是看着你的约束来看看有多少内容有滚动视图。 –

+0

我有一个非常类似的问题。我正在尝试创建一个滚动视图来增加和滚动以保留在屏幕上的文本字段。设置底部约束解决了我的问题! –

2

尝试通过

选择关闭autolayot ViewController然后file inspecto r和在interface builder document部分,你可以看到Use Autolayout检查与否。如果检查过,那么uncheck吧。

此信息UIScrollView And Autolayout可能会给细节。

+2

谢谢,这解决了滚动问题,但正如@EnricoSusatyo所说,似乎可以解决它而不禁用自动布局。 – golddove

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代表也 快乐编码!

1

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

如果接近结尾的东西被搞乱了(UIScrollView滚动的方向的末端),请将结尾的约束更改为尽可能低的优先级。