UIScrollView + Autolayout:如何在删除子视图时调整内容?

时间:2016-04-18 08:43:24

标签: ios objective-c uiscrollview ios-autolayout

我正在努力使用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];

0 个答案:

没有答案