我已经在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的截图:
以下是运行时的视图,但在任何位置进行水平或垂直滚动的任何尝试都不起作用。
答案 0 :(得分:23)
关闭自动布局,但不是解决方案。如果您确实需要自动布局,请使用它,如果您不需要,请将其关闭。但这不是解决方案的正确方法。
UIScrollView
与自动布局中的其他视图的工作方式不同。以下是关于自动布局的Apple's release note,我已经复制了有趣的一点(强调我的,在第三个要点):
然后,Apple继续展示如何正确使用以下是有关UIScrollView的自动布局支持的一些注意事项:
- 通常,“自动布局”会将视图的顶部,左侧,底部和右侧边缘视为可见边缘。也就是说,如果您将视图固定到 它的超级视图的左边缘,你真的把它钉在了它上面 superview边界的最小x值。更改边界原点 superview不会改变视图的位置。
- UIScrollView类通过更改其边界的原点来滚动其内容。要使用Auto Layout,顶部,左侧,底部, 滚动视图中的右边缘现在表示其内容的边缘 图。
- 滚动视图子视图的约束必须导致填充大小,然后将其解释为内容大小 滚动视图。 (这不应该与...混淆 用于自动布局的intrinsicContentSize方法。)调整滚动的大小 使用自动布局查看框架时,约束必须是显式的 关于滚动视图的宽度和高度,或者滚动视图的边缘 滚动视图必须绑定到其子树之外的视图。
- 请注意,您可以通过创建约束使滚动视图的子视图显示为浮动(不滚动)其他滚动内容 在视图和滚动视图的子树之外的视图之间,例如 滚动视图的超级视图。
UIScrollView
与自动布局。
作为一般规则,最简单的解决方法之一是在元素与UIScrollView底部之间创建约束。因此,在您希望位于UIScrollView底部的元素中,创建此底部空间约束:
再次,如果您不想使用自动布局,请将其关闭。然后,您可以按常规方式设置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
,它就可以按预期工作。