2017-02-21 6 views
1

Ich versuche, ein Textfeld zu verschieben, das sich im unteren Bereich einer Tabellenansicht befindet (in der Fußzeile). Also habe ich versucht, zwei Methoden:Verschieben einer Tabellenansicht, wenn die Tastatur angezeigt wird

  1. Um Automatisches Layout Einschränkung
  2. Animate Inhalt Einsätze eines Tableview zu animieren

Noch nicht von ihnen arbeiteten oder teilweise gearbeitet. Derzeit ist mir dies nicht in der Lage zu testen, auf einem echten iPad (App ist nur iPad) und ich auf Simulator mich entschieden, aber ich dachte, so etwas wie dies funktionieren soll:

  1. Animieren contentInsets

    func keyboardWillShow(notification: NSNotification) { 
        if let keyboardHeight = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height { 
         UIView.animate(withDuration: 0.2, animations: { 
          self.tableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardHeight, 0) 
         }) 
        } 
    } 
    
    func keyboardWillHide(notification: NSNotification) { 
        UIView.animate(withDuration: 0.2, animations: { 
         self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0) 
        }) 
    } 
    
  2. Animieren automatische Layout-Einschränkung

So in erstem Beispiel habe ich nie bemerkt animati on, noch der Inhalt von tableview content. Im zweiten Beispiel habe ich einen Outlet einer Auto-Layout-Constraint (vertikaler Abstand unten) gemacht, aber ich bekomme einige seltsame Ergebnisse. zB TableView bewegt sich nach oben, aber nicht vollständig und nur zum ersten Mal.

Wenn ich einen Haltepunkt setzen, ist keyboardHeight gleich 471. Ich vermisse etwas Offensichtliches?

+0

Verwenden [IQKeyboardManager] (https://github.com/hackiftekhar/IQKeyboardManager#installation- with-cocoapod-) – pkc456

+0

@ pkc456 Sorry, keine 3rd Party ist eine Option für mich. – Whirlwind

+0

Warum können Sie nicht am Simulator testen? – Devster101

Antwort

2

Dies ist, was ich ausprobiert habe und es funktionierte perfekt wie erwartet.

Können Sie überprüfen, wo Sie Ihre Benachrichtigungszentrale hinzugefügt haben?

- Animieren contentInsets

override func viewWillAppear(_ animated: Bool) { 
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil) 

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil) 
} 

func keyboardWillShow(notification: NSNotification) { 
    if let keyboardHeight = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height { 
     UIView.animate(withDuration: 0.2, animations: { 
      self.tbl.contentInset = UIEdgeInsetsMake(0, 0, keyboardHeight, 0) 
     }) 
    } 
} 

func keyboardWillHide(notification: NSNotification) { 
    UIView.animate(withDuration: 0.2, animations: { 
     self.tbl.contentInset = UIEdgeInsetsMake(0, 0, 0, 0) 
    }) 
} 

- Automatisches Layout Einschränkung

Stellen Sie sicher, beide setzen Bottom Layout und Höhenbeschränkungen nicht haben Animieren für UITableView in der Storyboard.

HINWEIS

Aber es gibt einen noch einfachen Weg, dies zu tun, nur durch ein UITableViewController verwenden. Es wird standardmäßig auf diese Funktion achten. Dies ist natürlich, wenn Sie kein Problem bei der Verwendung haben.

EDIT

UITextView wird ein wenig anders als UITextField handeln. Stellen Sie delegate für UITextView ein. Und tun Sie alle Tabellenansicht Alignments in textViewShouldBeginEditing.

extension ViewController: UITextViewDelegate { 
    func textViewShouldBeginEditing(_ textView: UITextView) -> Bool { 
     let pointInTable:CGPoint = textView.superview!.convert(textView.frame.origin, to: tbl) 
     tbl.contentOffset = CGPoint(x: tbl.contentOffset.x, y: pointInTable.y) 
     return true 
    } 
} 
+0

Danke werde ich überprüfen, sobald ich meine Hände auf Computer bekomme, aber ich würde sagen, ich Beobachter in ViewDidLoad setzen, und löschte sie in Deinit. Trotzdem bin ich mir sicher, dass diese Methoden funktionieren, weil ich einen Haltepunkt gesetzt habe. Und leider ist kein TableViewController hier eine Option ... – Whirlwind

+0

Das Seltsame ist, ich habe es versucht ... Und es funktioniert mit 'UITextField'. Aber ich benutze 'UITextView' und es funktioniert nicht wirklich. Ich meine, es gleitet, nicht für die richtige Menge. Zumindest sieht es so aus. – Whirlwind

+0

Sie möchten UITextView in der Tabellenfußansicht nach oben scrollen? – Matt

0

Ich benutze IQKeyboardManager Bibliothek, die dieses Verhalten Griffe: https://github.com/hackiftekhar/IQKeyboardManager

IQKeyboardManager ermöglicht es Ihnen, Fragen der Tastatur zu verhindern Schiebetüren oben und decken UITextField/UITextView, ohne dass Sie einen Code und ohne zusätzliche Einrichtung zur Eingabe erforderlich . Um IQKeyboardManager zu verwenden, müssen Sie Ihrem Projekt nur Quelldateien hinzufügen.

Es ist wirklich einfach zu implementieren. Importieren Sie die Bibliothek mit Hülsen, und fügen Sie einfach in Ihrem AppDelegate:

import IQKeyboardManager 

Und in didFinishLaunchingWithOptions:

IQKeyboardManager.sharedManager().enable = true 
Verwandte Themen