UITextField调整大小问题

时间:2013-11-15 09:48:06

标签: uiscrollview resize uitextfield

我发现UITextField存在问题。我创建了一个uitexfield的子类,允许用户单击文本开始编辑,然后旋转并调整文本大小。

如果通过使高度变大来调整文本字段的大小,则即使文本字段的宽度不增加,居中文本也会向右移动。我对此进行了调查,发现uitextfield有一个UIFieldEditor类型的内部视图,后者又有一个_UIFieldEditorContentView视图。 UIFieldEditor似乎是UIScrollView的子类,并且此scrollview的内容大小远大于uitextview的大小。当textview增加它的高度时,scrollview内容大小增加。我想这可能是内部自动布局问题。

我在这里添加了一个演示项目,演示了这个问题。点击文本开始编辑,然后拖动调整大小图标以使高度增加,您将看到问题。

https://github.com/permagnus/UITextField-Resize-Issue-Demo

来自revealapp的屏幕截图:

有关如何解决此问题的任何想法?

1 个答案:

答案 0 :(得分:3)

我找到了两种解决问题的方法:

问题在于底层的scrollview。一种方法是找到滚动视图,并查看它有多少,并补偿错误的偏移量:

- (CGRect)editingRectForBounds:(CGRect)bounds
{
    CGRect editRect = [super editingRectForBounds:bounds];

    UIScrollView *scrollView = [self findScrollViewFromView:self];

    if(scrollView)
    {
        float diff = (self.bounds.size.width - scrollView.contentSize.width)/2;
        return CGRectInset(editRect, diff, 0);
    }

    return editRect;
}

- (UIScrollView *)findScrollViewFromView:(UIView *)view
{
    if([view isKindOfClass:[UIScrollView class]])
    {
        return (UIScrollView *) view;
    }

    for(UIView *v in view.subviews)
    {
        UIScrollView *scrollView = [self findScrollViewFromView:v];

        if(scrollView)
        {
            return scrollView;
        }
    }

    return nil;
}

我还联系了Apple支持部门以了解他们的问题。他们证实这可能是一个错误,我已将其作为一个提交。他们的解决方案如下:

  

字段编辑器仅针对当前编辑会话激活,因此您可以   结束文本字段的编辑会话(通过调用   resignFirstResponder)在调整大小之前(在touchesBegan中......?)。在   你的场景,我想保持编辑会话可能不会   必要的。

     

如果你真的需要保持编辑会话,一个解决方案(丑陋)我   可以看到是重置文本并确保光标位于   文件开头:

self.text = [self.text copy];
UITextPosition *beginningOfDocument = [self positionFromPosition:self.beginningOfDocument offset:0];
self.selectedTextRange = [self textRangeFromPosition:self.beginningOfDocument toPosition:beginningOfDocument];

这两种解决方案都是糟糕的黑客,不推荐使用,因此您自行承担风险:)