UITextField调整大小问题

5
我发现了一个UITextField的问题。我创建了一个UITextfield的子类,允许用户点击文本以开始编辑,然后旋转和调整文本大小。
如果您通过增加高度来调整文本字段,则即使文本字段的宽度未增加,居中的文本也会向右移动。我已经调查了这个问题,并发现uitextfield具有类型为UIFieldEditor的内部视图,该视图又具有_UIFieldEditorContentView视图。UIFieldEditor似乎是UIScrollView的子类,此滚动视图的内容大小比uitextview的大小要大得多。当文本视图增加其高度时,滚动视图的内容大小宽度也会增加。我猜这可能是一个内部自动布局问题。
我在这里添加了一个演示项目,演示了这个问题。单击文本以开始编辑,然后拖动调整大小图标,使高度增加,您将看到问题。

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

来自revealapp的屏幕截图:

有什么解决这个问题的想法吗?

1个回答

4
我找到了两种解决方法:
问题出在底层的滚动视图中。一种方法是找到滚动视图,看看它偏移了多少,并补偿错误的偏移量。
- (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;
}

我还联系了苹果支持来了解问题的原因。他们确认这可能是一个错误,并将其提交为错误报告。他们提供的解决方案如下:

字段编辑器仅在当前编辑会话中激活,因此您可以在调整大小之前结束文本字段的编辑会话(通过调用resignFirstResponder)。在您的情况下,我猜保留编辑会话可能并不必要。

如果您确实需要保留编辑会话,则我能想到的一个解决方案(丑陋的)是重置文本并确保光标位于文档开头:

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

这两种解决方案都是很烂的技巧,不建议使用。如果您使用这些技巧,风险自负 :)


谢谢您找到这些解决方法。使用Apple建议的。在任何becomeFirstResponder之后调用此类似的函数:private func resetTextField(textField: UITextField) { let text = textField.text textField.text = "" textField.text = text } - alexey.metelkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接