2014-02-25 22 views
15

Ich habe eine gruppierte Tabellenansicht mit einer Zelle. In dieser Zelle setze ich eine UITextView in cellForRowAtIndexPath:, und ich mache sofort diesen ersten Responder.Zentrieren Sie den Text in einem UITextView, vertikal und horizontal

Mein Problem ist: Wenn ich anfange zu tippen, ist der Text linksbündig, nicht horizontal und vertikal zentriert, wie ich will. Dies ist auf iOS 7.

Wie kann ich den Text zentrieren?

+0

haben Sie Ausrichtung gesetzt und Ihren Code schreiben, wenn so – Yohan

+0

Keine Ausrichtungen eingestellt. – user3083408

Antwort

28

Ich löse dieses Problem, indem ich die Inhaltsgröße von UITextView beobachte, wenn es irgendeine Änderung in der contentSize gibt, aktualisiere den contentOffset.

Beobachter hinzufügen wie folgt:

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

den Beobachter Aktion Griff wie folgt:

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

Um das Textview-Text horizontal Mittelpunkt zu machen, wählen Sie die Textview aus .xib Klasse und gehen in die Bibliothek und in diesem Set Ausrichtung als Mitte.

Genießen. :)

+0

Das ist, was ich gesucht habe, vielen Dank! Noch eine weitere Frage: Bevor ich mit der Eingabe beginne, wird sie am unteren Rand der Tabellenansichtszelle ausgerichtet (der Cursor befindet sich unten). Wenn ich anfange zu tippen, ist es perfekt ausgerichtet. Weißt du, wie das zu beheben ist? – user3083408

+3

Wenn Sie einen Beobachter hinzufügen, vergessen Sie nicht, ihn zu entfernen: [self.messageTextView removeObserver: self forKeyPath: @ "contentSize"]; – ddiego

+0

Ändern von ContentOffset scheint nur zu funktionieren, wenn das Flag "Auswählbar" der Textansicht aktiviert ist – Maiaux

1

Sehr gute Lösung! Dies ist eine Swift + Interface Builder Lösung, so dass Sie es in IB aktivieren können.

Ich werde es als Teil der LSwift Bibliothek setzen.

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

Was ist 'textView.content_y'? Ich verstehe das nicht? –

+0

Sorry @AbubakarOladeji sollte 'contentOffset.y' sein. –

Verwandte Themen