UIScrollView自动重设contentSize



公平的警告,我是iOS的新手,可能缺少一些明显的东西。

我有一个带有几个字段的UIScrollView,这些字段的高度可以更改(UITextView可以拉伸以适应文本、可折叠字段等)。显然,我希望滚动视图contenSize适合内容,以便允许滚动。

现在,我将其设置为每次发生变化时都重新计算并设置contentSize,这很好,但有更好的方法吗?换句话说,如果另一个开发人员现在添加了一个字段,却不记得将其添加到重新计算函数中,除非我弄错了,否则即使该字段在滚动视图上,滚动视图contentSize也会出错?难道没有办法让它"自动"调整大小与内容的变化?

是的,有一种更好的方法可以通过自动布局来实现这一点。苹果有一个很好的文档,可以在这里使用滚动视图的自动布局。我更喜欢纯自动布局的方法,但是为了应用这种方法,您必须确保字段的大小不依赖于滚动视图的大小,这是有意义的。但是,请确保您的约束扩展到滚动视图的所有侧面,以便滚动视图可以确定其内容的大小。

(即@"H:|[textView(==view)]|"@"V:|[textView(50)]|",其中'|'表示textView是其子视图的滚动视图,'==view'仅指定textView的宽度必须与视图'view'的宽度相同。)

如果自动布局对你来说是一个选项,那么就用它吧——正如Tyler所说,自动布局为你抽象了调整大小的过程!:)不幸的是,我还没有自动布局的经验,所以我不能告诉你更多。

据我所知,没有自动布局就没有更好的方法。没有什么比"sizeToFit"或"sizeThatFits"更能自动调整内容大小的了。您必须自己重新计算内容大小。为此,可以使用您的自定义方法执行此重新计算任务,也可以在UIScrollView上查看一些第三方类别,这些类别都已为您实现并抽象。

例如:UIScrollView+MTUIAdditions.m(参见UIScrollView (MTUIAdditions)的实现)

最佳解决方案

//autoresize scrollView
CGFloat scrollViewHeight = 0.0f;
CGFloat scrollViewWidth = 0.0f;
for (UIView *view in self.scrollView.subviews) {
    CGFloat height = (view.frame.size.height + view.frame.origin.y);
    scrollViewHeight = ((height > scrollViewHeight) ? height : scrollViewHeight);
    CGFloat width = (view.frame.size.width + view.frame.origin.x);
    scrollViewWidth = ((width > scrollViewWidth) ? width : scrollViewWidth);
}
[self.scrollView setContentSize:(CGSizeMake(scrollViewWidth, scrollViewHeight))];

最新更新