2014-02-10 17 views

Antwort

7

Soweit ich weiß, gibt es keine eingebaute Methode für die vertikale Ausrichtung eines UITextView. Doch durch die die contentOffset aktualisieren Sie vertikal zentriert Text erhalten können:

[textView setTextAlignment:NSTextAlignmentCenter]; 

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [textView addObserver:self forKeyPath:@"contentSize" options:(NSKeyValueObservingOptionNew) context:NULL]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [textView removeObserver:self forKeyPath:@"contentSize"]; 
} 

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

Wohin geht dieser Code? (ViewController.m?) – Cindeselia

+0

@Cindeselia Die Art und Weise, wie der Code derzeit geschrieben wird, müssten Sie dort hinzufügen, wo sich Ihre Textansicht befindet. – Gad

+0

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

0

Sie den Kontext zur Verfügung stellen sollte, was meinen Sie tun, wenn Sie die horizontale und vertikale Ausrichtung ändern möchten,

Die UITextView hat ein Container und eine Rahmeneigenschaft, die Sie mit einem anderen UITextview/Imageview usw. ausrichten können. Die Rahmeneigenschaft hat einen Ursprung und eine Größe, die Sie ändern können, um Ihre Ansichten auszurichten.

Der Text in der UITextview hat eine Eigenschaft namens textalignment, die Sie auf NSTextAlignmentLeft, NSTextAlignmentJustified setzen können. Wie vorgeschlagen, können Sie auch die content offset-Eigenschaft des Containers anpassen, aber ich finde, dass die Anpassung des Frames einfacher ist.

-4
self.qtyField.textAlignment = NSTextAlignmentCenter; 
5

vertikal ausrichten Mitte mit Swift:

In viewDidLoad:

textField.addObserver(self, forKeyPath: "contentSize", options: NSKeyValueObservingOptions.New, context: nil) 

woanders Dann in Ihrem View-Controller:

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) { 

    var topCorrect : CGFloat = (textField.frame.height - textField.contentSize.height); 
    topCorrect = topCorrect < 0.0 ? 0.0 : topCorrect/2 
    textField.contentOffset = CGPoint(x: 0, y: -topCorrect) 

} 

wo textfield verdrahtet ist auf die tatsächliche up Textfeld in Ihrer Sicht.

+0

das richtig funktioniert, aber irgendwie funktioniert es nicht mit einem Abwicklungssegment ... irgendeine Idee warum? – SKYnine

24

Dies ist eine Swift-Lösung und unterscheidet sich nun, da sich Inhaltseinfügungen und Offsets leicht geändert haben. Diese Lösung funktioniert in Xcode 7 Beta 6.

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    textView.addObserver(self, forKeyPath: "contentSize", options: NSKeyValueObservingOptions.New, context: nil) 
} 

override func viewWillDisappear(animated: Bool) { 
    super.viewWillDisappear(animated) 
    textView.removeObserver(self, forKeyPath: "contentSize") 
} 

Apple hat verändert, wie Content-Offsets und -einsätze arbeiten diese leicht modifizierte Lösung nun die oben auf den Inhalt Einsatz anstelle des Offset erforderlich einzustellen.

/// Force the text in a UITextView to always center itself. 
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 
    let textView = object as! UITextView 
    var topCorrect = (textView.bounds.size.height - textView.contentSize.height * textView.zoomScale)/2 
    topCorrect = topCorrect < 0.0 ? 0.0 : topCorrect; 
    textView.contentInset.top = topCorrect 
} 
+1

Das hat bei IOS 9/Swift 2 super funktioniert, danke! – Kitson

+0

Ehrfürchtig .. arbeitete für mich. verschwendete fast 2 Stunden. –

+0

Danke, arbeitete für mich gespeichert meine Zeit –

Verwandte Themen