iOS7 UITextView scrollEnabled = YES height

时间:2014-03-14 01:50:34

标签: ios ios7 textview

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

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

在进入新行并启用滚动之前:

enter image description here

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

enter image description here

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

enter image description here

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

编辑:

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

下面显示了用于编辑文本视图高度的代码(它是一个选择器的方法,将在收到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;
        }
    }
}

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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.

答案 2 :(得分:2)

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

  1. 将顶部,前导,底部,尾部边距限制添加到我的文本视图
  2. 添加大于或等于最小高度约束,优先级为999(在我的情况下设置为50)
  3. 添加小于或等于最大高度约束优先级为1000(在我的情况下,这被设置为125)
  4. 添加优先级为1000(设置为125)的等高高度约束,并确保未安装(取消选中Interface Builder中已安装的&#39;选项或设置&#39;活动& #39;对代码中的约束为NO / false)
  5. 然后我使用以下代码来确定文本视图的高度并启用/禁用滚动和约束:

    - (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:确定所需的文本视图大小,我设置了滚动启用或禁用。如果已启用,我将高度约束设置为活动以强制文本视图保持所需的高度。