4

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

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

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

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

来自revealapp的截图:

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

4

1 回答 1

3

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

问题在于底层滚动视图。一种方法是找到滚动视图并确定它的偏移量并补偿错误的偏移量:

- (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];

这两种解决方案都是糟糕的 hack,不推荐使用,因此您使用这些解决方案需要您自担风险:)

于 2013-11-29T07:39:46.950 回答