iOS的ScrollView需要约束的位置或高度

-ViewController --View ---ScrollView (Top,Bottom,Leading,Trailing spaces to superview set to 0) ----ContentView (Top,Bottom,Leading,Trailing spaces to superview set to 0, Width equals with View (ViewController's child)) -----Label1 -----etc... 

如果我为我的内容视图(例如1000)设置了一个特定的高度限制,ScrollView工作正常,但是我得到了一个静态的ContentView 1000,这不是我的目标,因为我的contentView获得了dynamic内容,所以它应该是内容的高度需要。

如果我删除了我的ContentView的高度限制,Xcode说:

 Missing Constraints: ScrollView need constraints for: Y position or height 

ScrollView实际上是固定在顶部和底部,所以我不知道为什么Xcode想为ScrollView的高度约束…

当我想让ContentView高度成为内容需要的高度时,正确的方法是什么?

每当使用带有自动布局的ScrollView时,请始终按照以下步骤操作,

  1. ScrollView约束:leadingSpace,topSpace,TrailingSpace,bottomSpace到superView,并确保当你控制拖动添加约束添加按alt,使约束将被设置为无边距。

  2. 在滚动视图内添加UIView作为内容视图,并将其约束:leadingSpace,topSpace,trailingSpace,bottomSpace设置为ScrollView而不按altbutton,并将等宽设置为ScrollView。

  3. 无论您在此内容视图中添加的视图都必须具有从上到下的约束,即所有视图都应该有垂直约束,因此contentView可以根据其内容计算自身所需的高度。

如果约束设置正确,那么scrollView会根据其中的组件自动设置它的内容大小,你不需要手动设置内容大小,scrollView将只会滚动,如果容器视图内的组件不适合内部否则不会滚动。 如果你想让它滚动,那么你需要检查从故事板的垂直反弹属性来获得反弹效果。

注意: 当你为scrollView中的组件设置约束的时候,你会看到约束警告,直到你设置从顶层组件到底层组件的约束,一定要记住顶层组件应该有顶层约束(垂直约束)底部的组件应该对超级视图有底部空间限制。 当这个满足时,所有的警告将最终消失。

ScrollView约束:

在这里输入图像说明

ContainerView约束:

在这里输入图像说明

  1. select你的视图控制器
  2. 取消选中“调整滚动查看插图”

在这里输入图像说明

它会工作

 -ViewController --View ---ScrollView (Top,Bottom,Leading,Trailing spaces to superview set to 0) ----ContentView (Top,Leading,Trailing spaces to ScorllView set to 0 | Height to dynamic (1000)) -----Label1 -----etc... 

为您的ContentView,您自己的内容计算做同样的事情

 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:YES]; [self adjustHeightOfTableview]; } - (void)adjustHeightOfTableview { CGFloat height = tblMainMenu.contentSize.height; CGFloat maxHeight = tblMainMenu.superview.frame.size.height - tblMainMenu.frame.origin.y; // if the height of the content is greater than the maxHeight of // total space on the screen, limit the height to the size of the // superview. if (height > maxHeight) height = maxHeight; // now set the height constraint accordingly self.tableViewHeightConstraint.constant = height; [UIView animateWithDuration:0.1 animations:^{ [self.view setNeedsUpdateConstraints]; }]; } 

编辑1

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *OptName_length = @" Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam"; NSDictionary *attributes = @{NSFontAttributeName: [UIFont systemFontOfSize:17.0]}; CGRect rect = [OptName_length boundingRectWithSize:CGSizeMake(tableView.bounds.size.width-150.0, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil]; CGSize requiredSize = rect.size; return requiredSize.height +5.0f; } 

编辑2

检查网站,这将帮助你… uitableviewcell-dynamic-height-with-autolayout-conclusion

使用滚动视图的内容视图设置您的标签左上angular和右下angular的边界约束,并将UILable的行数设置为0.它将根据内容的大小扩展您的内容视图

在这里输入图像说明

Bharat Modi的回答几乎解决了这个问题,但我(Xcode 8.3.2,iOS 10 SDK)也不得不将内容视图的高度和宽度与UIScrollView的高度和宽度相匹配。

这将把内容大小固定到可见区域,但是它使IB感到高兴。 然后(我认为)这只是正确计算内容大小并以编程方式进行设置的问题。 无论如何,我将不得不这样做,因为如果你有dynamic的内容,你只能在运行时做到这一点。

如果您有导航栏,您可能还需要调整视图控制器的“调整滚动视图插图”设置。

这是我的:

IB中的UIScrollView没有警告

请注意,这可能只是我的设置的一个特点,因为官方build议( https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/WorkingwithScrollViews.html )也没有提到这个需要完成。

我试图用一个滚动视图,一个内容视图和另一个固定宽度和高度的虚拟视图来模拟内容,但没有任何东西似乎让IB很开心。

(对不起,我没有足够的代表把这个作为评论原来的答案)。


更新:

所以实际上我最终做的是在IB中将Content View设置为固定的高度,并在代码中为高度约束创build出口。 然后,视图已经加载了所有的dynamic内容后,我只是更新高度约束如下所示:

 self.uiContentViewHeightConstraint.constant = mapViewBottomY + 15 

一切正常。 这里的关键是,当滚动视图中存在视图时,该视图定义滚动视图的内容大小。 正如人们之前提到的,内容视图的大小必须在构build时完全定义,以便IB获得快乐。 您可以自由地通过网点在运行时操作这些值 – 这很容易,也很安全。

在IB中拥有固定大小的内容视图的一个好处是,由于您已经修复了内容大小,现在可以像往常一样使用相对偏移来定义内容视图内的视图。