2013-11-15 192 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 } –