我正在努力使用UIScrollView
自动设置Autolayout
的内容大小。
视图层次结构非常简单:
UIView (RootView)
UIScrollView
UIView (My own container view)
UILabel (Headline)
UILabel (Content)
UILabel (Headline)
UILabel (Content)
...
UIButton
因此容器视图包含许多UILabel
对,表示标题和某些内容的段落。
最大数量为5个段落,因此容器视图中堆叠了10个UILabel。第一个(标题)标签对容器视图的顶部有一个约束。所有标签都相互垂直约束。最后一个标签对底部的UIButton
有一个垂直约束,它本身就是容器视图底部的高度和垂直约束。因此,容器视图的高度由其子视图很好地定义。
除了对最后一个标签的垂直约束外,Button还对具有较低优先级的第一个内容标签(第二个标签)具有垂直约束。当从容器视图中删除其他标签时,将使用此约束(请参见下文)。
容器视图本身作为UIScrollView
顶部和底部的垂直约束,从而定义内容大小。
根据上下文,我在viewDidLoad
中设置了标签的内容:
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.title = NSLocalizedString(@"LOC_WebApp", nil);
if (self.mode == mode1) {
self.headlineLabel1.text = NSLocalizedString(@"...", nil);
self.infoLabel1.text = NSLocalizedString(@"...", nil);
self.headlineLabel2.text = NSLocalizedString(@"...", nil);
self.infoLabel2.text = NSLocalizedString(@"...", nil);
...
} else {
self.headlineLabel1.text = NSLocalizedString(@"...", nil);
self.infoLabel1.text = NSLocalizedString(@"...", nil);
[self.headlineLabel2 removeFromSuperview];
[self.infoLabel2 removeFromSuperview];
...
}
[self.view layoutIfNeeded];
}
在mode1
(伪代码)中,everthing工作正常:所有标签都会获得其内容并自动调整contentSize
。但是当在第二种情况下删除一些标签时,ScrollView获得与第一种情况相同的contentSize
,现在的声音太大了。虽然完整内容现在可以放在一个屏幕上,但仍然可以向下滚动多个屏幕到底部,就像所有标签仍然会显示一样。
删除标签后重置布局无效。
我发现了几个处理类似问题的问题。然而,解决方案是使用单UIScrollView
子视图并确保其约束设置正确。这就是这种情况。那么我还能做些什么来自动调整contentSize
?
手动设置contentSize也不起作用:
self.scrollView.contentSize = CGSizeMake(self.scrollView.contentSize.width, self.containerView.frame.size.height + 30);
[self.view layoutIfNeeded];