2016-06-27 13 views
1

Ich habe eine Textfield-Zone, die eine flexible Höhe haben soll, entlang der Anzahl der Zeilen wächst, die Sie geschrieben haben.Wie füge ich einen Beobachter für eine wechselnde Höhe hinzu?

Ich möchte hören, es ist die Höhe der Änderung und dann, wenn eine neue Zeile erstellt wird, wird dieser Hörer sagen "Hallo, die Höhe hat sich geändert!".

Initial Height

---------- Anfangshöhe ----------

Height has changed !

------- --- Höhe hat sich geändert !!! ----------

Ich kann keinen richtigen Weg, herauszufinden, dies zu tun, weil addObserver in swift einen NotificationIdentifier wie keyboardWillShow benötigen und hier habe ich nicht ein, wie heightWillChange.

Wie kann ich eine Funktion aufrufen, wenn sich die Höhe geändert hat?

+0

Sie Sie 'UITextView' für Eingabetext? –

+0

Ja, das tue ich. Es ist eine benutzerdefinierte UITextView-Klasse. –

+1

Vielleicht hilft Ihnen das http://stackoverflow.com/questions/4000664/is-there-a-uiview-resize-event – tbilopavlovic

Antwort

1

Verwenden Delegatmethode Ihrer UITextView

var textViewHeight: CGFloat = 0 

func textViewDidChange(textView: UITextView) 
{ 
    let newTextViewHeight = textView.frame.size.height 
    if textViewHeight != newTextViewHeight 
    { 
     print("---------- Height has changed !!! ----------") 
    } 
    textViewHeight = newTextViewHeight 
} 
+0

Hier benutze ich diese Technik, aber es verursacht ein Problem. Tatsächlich wird das Höhenverhalten von textView von einer anderen Klasse beherrscht und diese Klasse wird nach dem textViewDidChange aufgerufen. Dann ändert sich die Höhe für eine Änderung, aber zu spät, um von textViewDidChange abgefangen zu werden. –

+0

@ Bram'in Wenn ja, kannst du in deine benutzerdefinierte Klasse tauchen und einen Ort finden, an dem alle Änderungen enden. Sie können das Repository forkieren, wenn es sich um github handelt, oder Sie können eine Pull-Anforderung mit didChangeHeight-Funktionalität erstellen. –

0

Sie können KVO verwenden. Wenn Sie dies von einem View-Controller aus tun, können Sie Beobachtungen in viewDidLoad hinzufügen. Zum Beispiel:

override func viewDidLoad() { 
     super.viewDidLoad() 
     self.textField = UITextField(frame: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0)) 

     self.textField.addObserver(self, forKeyPath: "frame", options: .New, context: nil) 
    } 

reagieren dann in:

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 
     if keyPath == "frame" && object === self.textField 
     { 
      print(self.textField.frame) 
     } 
    } 

Dann entfernen Sie beobachten, wenn Ihr View-Controller deinited ist:

deinit { 
    self.textField.removeObserver(self, forKeyPath: "frame") 
} 
+0

Vielen Dank für Ihre Antwort. Ich habe Ihre Lösung versucht, aber es funktioniert immer noch nicht. Der Beobachter bemerkt nichts. Ich habe einige Nachforschungen angestellt, und was ich herausfinden kann, ist, dass ein Beobachter ziemlich kompliziert zu deklarieren ist. Diese Lösung scheint die beste zu sein, sollte aber modifiziert werden. Ich schaue mir das morgen an. –