使用AutoLayout扩展到指定的高度后,重新启用UITextView滚动

问题描述 投票:4回答:5

我知道有一些类似的帖子,但它们似乎不适用于我。

我有一个uitextview,它的行为类似于Messenger应用程序。

我使用了自动布局和[textview setScrollEnabled:NO]以允许uitextview在键盘上方动态扩展。当然,它会一直增长到到达屏幕顶部。当它停止增长时,您将看不到任何其他文本。

我试图找到在textViewDidChange内停止增长的高度,并称为[textView setScrollEnabled:YES],但在增长之前缩小了初始大小。

到达一定高度或无法再增长时如何启用滚动?

objective-c ios8 xcode6 uitextview ios-autolayout
5个回答
6
投票

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

看起来像这样:

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

1
投票

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

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

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


0
投票

这是一项研究,这里是您的线索。

  1. 将您的文本视图分类。

  2. 监视器contentSize发生变化,可能有一个可以重写的设置器,或者只是KVO可以工作。

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

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


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个点以内时,它得到的高度约束等于其当前高度。


0
投票

rdelmar当高度再次小于50点时如何重置约束?

© www.soinside.com 2019 - 2024. All rights reserved.