2013-11-15 145 views
2

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

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

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

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

Screenhots:在滚动视图基础视图的

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

回答

3

我发现了两个方法来解决这个问题:

的问题在于底层滚动视图中。一种方法是找到了滚动和SE多少offseted它是和补偿错误偏移:

- (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支持以获得他们的问题点。他们证实,这可能是一个错误,我已经提交它作为一个。他们的解决方案是:

字段编辑器只调整其大小(在之前的touchesBegan激活当前编辑会话,这样你就可以 结束文本字段的编辑会话(通过调用 resignFirstResponder)...? )。在 你的场景中,我想保持编辑会话可能不是 必要的。

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

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

这两种解决方案都是低劣的黑客,不推荐,因此您需要自担风险:)

+0

感谢您发现这些解决方法。使用Apple建议。在任何成为FirstFoundResponder之后调用类似以下的私人func resetTextField(textField:UITextField)let text = textField.text textField.text =“” textField.text = text } –