仅UIScrollView自动布局垂直

我想让AutoLayout与UIScrollView一起工作,并且遇到了一些麻烦。 这是我做的:

  1. 在主视图中添加一个UIScrollView :[top:0,left:0,width:320,height:568]

  2. 使用frame和bgcolor black添加UIScrollView里面的UIView “ContentView”:[top:0,left:0,width:320,height:568]

  3. 设置UIScrollView约束:[top:0,bottom:0,left:0,right:0]

  4. 设置“ContentView”约束:[top:0,bottom:0,left:0,right:0]

  5. alignment“ContentView”中的项目

  6. 将主视图bgcolor设置为灰色(看看发生了什么)

这里是问题的截图: http : //imgur.com/P8s9lB0

由于某些原因,约束使内容视图位于屏幕中间。 而且,它在每个方向都滚动。 我想只能在UITableView垂直方向滚动内容,所以我不能像这样移动它: http : //imgur.com/lBCwfAS

我究竟做错了什么? 我已经检查了所有的教程和答案,我可以在StackOverflow和Googlefind,没有人真的有一个奇怪的问题,所以我正在寻求帮助。

编辑:我也joinContentView的宽度和高度作为约束,这也没有帮助。

要禁用水平滚动,可以在(void)scrollViewDidScroll方法中设置内容大小。

 [self.scrollView setContentOffset: CGPointMake(0, self.scrollView.contentOffset.y)]; 

您还需要设置方向锁,因此一次只能使用1个滚动方向。 https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIScrollView_Class/index.html#//apple_ref/occ/instp/UIScrollView/directionalLockEnabled

 self.scrollView.directionalLockEnabled = YES; 

总结Leszek S的答案:

为了具有垂直滚动视图,滚动视图内的所有视图必须设置其 宽度约束 。 很容易设置为滚动视图的超级视图。

原因是滚动视图不会水平滚动,只要其子视图都不需要水平滚动即可。 例如,如果您有一个标签,将其设置为0行,则在开始添加行和换行符之前,自动布局将尝试使标签尽可能宽。 如果标签上没有明确的宽度限制,则只会使滚动视图的内容区域变宽。 尾随滚动视图的约束被忽略。

如果你有一堆视图,你可能想把它们放在一个包含视图的单个视图中。 对于我的情况,我只有5或6个标签可以dynamic改变高度,但不应该改变宽度,所以我只是把它们和滚动视图的宽度一样。 而宾果,垂直滚动视图与标签的增长或缩小取决于文本。

你可以完全使用约束来做到这一点,这很容易。

UIScrollView只需要了解它里面有多less宽度和空间。 所以它需要把一些东西固定在LeadingTrailingTopBottom约束上。 另外内容的宽度和高度需要固定(这并不意味着我必须具体说明,我仍然可以使用约束来实现这一点)。

  1. 根据需要添加一个UIScrollView和位置。
  2. UIScrollView为内容添加一个UIView
  3. 将内容UIViewLeadingTrailingTopBottom约束设置为0。
  4. Equal Width约束添加到UIScrollViewUIView 。 这将使其只能垂直滚动。
  5. 您现在需要设置内容UIView的高度。 然后,您可以指定内容视图的高度(blech),或使用其中包含的控件的高度,确保底部控件被限制在内容视图的底部。

我做到了这一点,它工作得很好。

我写了一个函数,允许垂直滚动内容但不水平。 它在scrollview内创build一个宽度有限的UIView,并embedded所有的scrollview子视图。

 TegScrolledContent.createContentView(scrollView) 

https://github.com/exchangegroup/scrollable-content-ios

在这里输入图像说明

给内容视图明确的高度和宽度约束

下面是我用来实现垂直滚动视图的代码片段。 它通过添加内容视图作为滚动视图的子视图,然后将该内容视图的宽度限制为父滚动视图的宽度。 从那时起,所有的子视图都应该添加到内容视图中,而不是添加到滚动视图中。

 // View that will contain content of scroll view. Width is constrained to the width of the scroll view. UIView *contentView = [[UIView alloc] init]; contentView.translatesAutoresizingMaskIntoConstraints = NO; [scrollView addSubview:contentView]; views[@"contentView"] = contentView; [scrollView addConstraint:[NSLayoutConstraint constraintWithItem:contentView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]]; [scrollView addConstraint:[NSLayoutConstraint constraintWithItem:contentView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]]; [scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" options:0 metrics:nil views:views]]; // Now, add all your subviews to contentView 

随着@ derek的回答,我想补充说,设置contentOffset总是在scrollViewDidScroll会导致性能问题。 所以请只检查x是不是0然后设置contentOffset

  if(contentOffset.x != 0){ setContentOffset(CGPointMake(0, contentOffset.y), animated: false) } 

是的滚动视图

 directionalLockEnabled = true