根据视图的内容更改ScrollView的高度

我parsing了一些Json数据,并使用各种UITextView显示它,现在我使用了一个由Storyboard创build的ScrollView,它的高度为1000px,但有时我无法显示整个数据,因为它太长,不适合ScrollView,我怎么能以编程方式更新它,以获得基于视图必须显示的内容的高度?

去你的故事板,并删除您的UITextViews的所有高度约束。 为了避免在故事板中发出警告,请select内置大小 – >在您的ScrollView中放置每个UITextView的Holder。 该选项位于Size Inspector(右侧窗格)中。 这将告诉XCode知道你不想指定高度,而是希望它们基于其intrinsicContentSize。

最后,创build一个从UITextViewinheritance的新类“FitContentTextView”。 在故事板中,使所有的UITextView的,你想有足够的大小,以适应FitContentTextViewtypes的内容

- (void)setText:(NSString *)text { [self setScrollEnabled:YES]; [super setText:text]; [self invalidateIntrinsicContentSize]; } - (CGSize)intrinsicContentSize { CGSize size = [self contentSize]; return size; } 

setText中的setScrollEnabled事物很重要。 如果启用滚动,contentSize方法只返回足够的大小以适应所有文本。 否则,将返回TextView的边界。

此外,每次我们设置文本时都调用invalidateIntrinsicContentSize,确保在绘制TextView之前,autolayout将调用方法intrinsicContentSize,并将其添加到该方法中。

最后,请记得从上到下将所有ScrollView的子视图垂直固定到它的超级视图。 这是AutoLayout可以更新SrollView的contentSize以适应所有子视图的唯一方法。

你可以计算文本的高度:

  CGRect textRect = [@"your text" boundingRectWithSize:CGSizeMake(yourScrollView.width, CGFLOAT_MAX) options:(NSStringDrawingUsesLineFragmentOrigin) attributes:@{NSFontAttributeName:[UIFont fontWithName:@"HelveticaNeue" size:18]} context:nil]; 

然后更新scrollView的contentSize

 [yourScrollView setContentSize:CGSizeMake(yourScrollView.frame.size.width,textRect.size.height)];