【问题标题】:iOS7 UITextView scrollEnabled=YES heightiOS7 UITextView scrollEnabled=YES 高度
【发布时间】:2014-04-19 03:12:44
【问题描述】:

我正在做一个测试项目,遇到了 UITextView 的问题。

我在文本视图中动态获取文本的内容大小,然后在需要时增加其高度。当高度达到我设置的阈值时,我将设置 scrollEnabled = YES 以启用滚动。如以下屏幕截图所示,似乎发生了奇怪的事情:

在换行和启用滚动之前:

输入下一个字符后,将启用滚动:

之后,再次输入另一个字符,启用滚动后文本视图将再次恢复正常(实际上高度与之前的屏幕截图一样,我根据内容大小更改高度,所以它与之前的高度相同启用滚动):

有人遇到过这个问题并且能够解决吗?如果这是一个 iOS7 错误,还有其他关于创建消息输入文本框的建议吗?我想知道以前的iOS版本是否有这个问题。

已编辑:

当textview的scrollEnabled为YES并更改textview.frame.size.height时,似乎会出现此问题,然后高度将重置为初始高度(如在Interface Builder中设置的高度)。想知道这是否有助于解决这个问题。

下面显示了用于编辑文本视图高度的代码(这是一个选择器的方法,将在收到 UITextViewTextDidChangeNotification 时调用):

NSInteger maxInputFieldWidth = self.inputTextField.frame.size.width;

CGSize maxSize = CGSizeMake(maxInputFieldWidth, 9999);
CGSize neededSize = [self.inputTextField sizeThatFits:maxSize];

NSInteger neededHeight = neededSize.height;

if (self.inputTextField.hasText)
{
    [self.inputTextField scrollRangeToVisible:NSMakeRange([self.inputTextField.text length], 0)];

    if (neededHeight <= TEXTVIEW_MAX_HEIGHT_IN_USE && neededHeight != previousHeight)
    {
        previousHeight = neededHeight;

        CGRect inputTextFieldFrame = self.inputTextField.frame;
        inputTextFieldFrame.size.height = neededHeight;
        inputTextFieldFrame.origin.y = TEXTVIEW_ORIGIN_Y;
        self.inputTextField.frame = inputTextFieldFrame;
    }
    else if (neededSize.height > TEXTVIEW_MAX_HEIGHT_IN_USE)
    {
        if (!self.inputTextField.scrollEnabled)
        {
            self.inputTextField.scrollEnabled = YES;

            CGRect inputTextFieldFrame = self.inputTextField.frame;
            inputTextFieldFrame.size.height = TEXTVIEW_MAX_HEIGHT_IN_USE;
            inputTextFieldFrame.origin.y = TEXTVIEW_ORIGIN_Y;
            self.inputTextField.frame = inputTextFieldFrame;
        }
        else if (neededHeight != previousHeight)
        {
            previousHeight = neededHeight;

            CGRect inputTextFieldFrame = self.inputTextField.frame;
            inputTextFieldFrame.size.height = TEXTVIEW_MAX_HEIGHT_IN_USE;
            inputTextFieldFrame.origin.y = TEXTVIEW_ORIGIN_Y;
            self.inputTextField.frame = inputTextFieldFrame;
        }
    }
}

【问题讨论】:

  • 也许你可以上传你用来调整文本视图大小的代码?
  • 刚刚编辑了问题,添加了代码块来调整textview的大小,self.inputTextField是UITextView
  • 您的代码似乎没有任何问题。尝试放置 previousHeight = requiredHeight;在 if(!self.inputTextField.scrollEnabled) 循环中,看看它是否有效。
  • err... UITextView 已添加到 InterfaceBuilder 中,这是否会导致我的问题?
  • 应该不是问题,除非您忘记设置 outlet 和 ibaction 参考。

标签: ios ios7 textview


【解决方案1】:

一年多之后,scrollEnabled 仍然导致问题。我有一个类似的问题,设置 scrollEnabled = true(我正在使用 Swift)不会导致任何更改。

我通过在 textView 的所有侧面设置自动布局约束解决了这个问题。然后,就像您在此处详述的那样,我再次设置textView.frame。我的猜测是这会导致一些内部更新,实际上会打开滚动。我还猜测自动布局会强制 textView 保持在正确的高度,而不是您正在经历的崩溃。

【讨论】:

  • 绝对正确,这应该是公认的答案。只是补充一点,你不需要改变框架大小,你可以把这个代码:textView.frame = textView.frame
【解决方案2】:

才华横溢的 Pete Steinberger 在 UITextView 方面遇到了很多问题,因此实施了很多修复。

His article can be found here with links to his code.

For a direct link to the code, it can be found here, but I recommend reading the post.

【讨论】:

【解决方案3】:

我遇到了类似的问题(我正在使用自动布局)并且能够通过以下设置解决它:

  1. 向我的文本视图添加顶部、前导、底部、尾随边距约束
  2. 添加优先级为 999 的大于或等于最小高度约束(在我的情况下,此设置为 50)
  3. 添加优先级为 1000 的小于或等于最大高度约束(在我的情况下,此设置为 125)
  4. 添加优先级为 1000(设置为 125)的等高约束并确保未安装(取消选中 Interface Builder 中的“已安装”选项或将代码中约束的“活动”设置为 NO/false)

然后我使用以下代码来确定文本视图的高度并启用/禁用滚动和约束:

- (void)textViewDidChange:(UITextView *)textView {
    ...

    CGSize size = textView.bounds.size;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(size.width, CGFLOAT_MAX)];

    if (newSize.height >= self.textViewMaxHeightConstraint.constant
        && !textView.scrollEnabled) {
        textView.scrollEnabled = YES;
        self.textViewHeightConstraint.active = YES;
    } else if (newSize.height < self.textViewMaxHeightConstraint.constant
               && textView.scrollEnabled) {
        textView.scrollEnabled = NO;
        self.textViewHeightConstraint.active = NO;
    }

    ...
}

使用sizeThatFits: 来确定所需的文本视图大小,我将滚动设置为启用或禁用。如果启用,我将高度约束设置为 active 以强制文本视图保持在所需的高度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 2017-01-04
    • 2011-06-20
    相关资源
    最近更新 更多