使用AutoLayout将UITextView扩展到指定高度后重新启用它

时间:2014-12-03 13:03:13

标签: objective-c ios8 xcode6 uitextview ios-autolayout

我知道有一些类似的帖子,但它们似乎对我不起作用。

我有一个uitextview,我想表现得类似于messenging应用程序。

我使用了autolayouts和[textview setScrollEnabled:NO]来允许uitextview在键盘上方动态扩展。当然,它会一直延伸到屏幕顶部。当它停止增长时,你无法看到任何其他文字。

我试图在textViewDidChange中找到它停止生长的高度并调用[textView setScrollEnabled:YES],但它在缩小之前缩小了初始大小。

如何在滚动到达某个高度或不再生长时启用滚动?

4 个答案:

答案 0 :(得分:6)

到目前为止,我发现的最佳解决方案是启用滚动并根据文本浏览量的内容大小更改textview的高度。

看起来像这样:

- (void)textViewDidChange:(UITextView *)textView
{
    self.consTextViewHeight.constant = MIN(MAX_HEIGHT, textView.contentSize.height + textView.textContainerInset.top);
}

答案 1 :(得分:1)

您是否尝试过为TextView设置SetContent?如果您想等待自动布局完成,可以在viewDidLayoutSubviews中执行此操作。

以下是有用的链接:how set content size of textView's Scrollview immediately when user starts scrolling or when tap on textview

注意:这应该是评论,但我没有足够的声誉......

答案 2 :(得分:0)

这是一项研究,在这里是你的主角。

  1. 对文字视图进行子类化。

  2. 监控contentSize更改,可能有一个你可以覆盖的setter或只是KVO可以工作。

  3. 创建文本视图委托,它将ping您的控制器以更新自动布局约束。

  4. 当contentSize达到您定义的最大值时,只需钳制该值并让文本视图自然滚动。

答案 3 :(得分:0)

当文本视图到达距屏幕顶部所需的距离时,将高度约束添加到文本视图中。我这样做了,

-(void)textViewDidChange:(UITextView *)textView {
    if (textView.scrollEnabled == NO) {
        if (textView.frame.origin.y < 50) {
            [textView addConstraint:[NSLayoutConstraint constraintWithItem:textView attribute:NSLayoutAttributeHeight relatedBy:0 toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:textView.frame.size.height]];
            textView.scrollEnabled = YES;
        }
    }
}

当文本视图从视图顶部增长到50个点以内时,它会获得一个等于其当前高度的高度约束。