2014-02-25 156 views
15

我有一個單元格的分組表格視圖。在這個單元格中,我將UITextView放入cellForRowAtIndexPath:,我立刻做出了第一個響應者。垂直和水平居中文本在UITextView中

我的問題是:當我開始輸入時,文本是左對齊的,而不是水平和垂直居中,如我所願。這是在iOS 7上。

如何將文本居中?

+0

您是否設置了對齊方式併發布了您的代碼? – Yohan

+0

未設置對齊方式。 – user3083408

回答

28

我通過觀察UITextView的內容,解決了這個問題,當contentSize有任何變化時,更新contentOffset。

添加觀察員如下:

[textview addObserver:self forKeyPath:@"contentSize" options:(NSKeyValueObservingOptionNew) context:NULL]; 

處理觀察者動作如下:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    UITextView *txtview = object; 
    CGFloat topoffset = ([txtview bounds].size.height - [txtview contentSize].height * [txtview zoomScale])/2.0; 
    topoffset = (topoffset < 0.0 ? 0.0 : topoffset); 
    txtview.contentOffset = (CGPoint){.x = 0, .y = -topoffset}; 
} 

爲了讓TextView的文字水平居中,距離的.xib類選擇的TextView和去圖書館並以此爲中心對齊。

享受。 :)

+0

這就是我正在尋找的,非常感謝你! 只有一個問題:在我開始輸入之前,它與tableview單元格的底部對齊(光標位於底部)。當我開始打字時,它完全對齊。你知道如何解決這個問題嗎? – user3083408

+3

如果你添加一個觀察者,不要忘記刪除它:[self.messageTextView removeObserver:self forKeyPath:@「contentSize」]; – ddiego

+0

只有在檢查文本視圖的「可選」標誌時,更改contentOffset似乎纔有效 – Maiaux

1

非常好的解決方案!這是一個Swift + Interface Builder解決方案,以便您可以在IB中啓用它。

我會把它作爲LSwift庫的一部分。

extension UITextView { 
    @IBInspectable var align_middle_vertical: Bool { 
     get { 
      return false // TODO 
     } 
     set (f) { 
      self.addObserver(self, forKeyPath:"contentSize", options:.New, context:nil) 
     } 
    } 
    override public func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject:AnyObject], context: UnsafeMutablePointer<Void>) { 
     if let textView = object as? UITextView { 
      var y: CGFloat = (textView.bounds.size.height - textView.contentSize.height * textView.zoomScale)/2.0; 
      if y < 0 { 
       y = 0 
      } 
      textView.content_y = -y 
     } 
    } 
} 

public extension UIScrollView { 
    public var content_x: CGFloat { 
     set(f) { 
      contentOffset.x = f 
     } 
     get { 
      return contentOffset.x 
     } 
    } 
    public var content_y: CGFloat { 
     set(f) { 
      contentOffset.y = f 
     } 
     get { 
      return contentOffset.y 
     } 
    } 
} 
+0

什麼是'textView.content_y'我似乎不明白? –

+0

對不起@AbubakarOladeji應該是'contentOffset.y'。 –