2016-04-24 7 views
0

OK, also versuche ich ein Add-Kommentar-Feld in meiner Sicht zu implementieren. Hier ist das Layout:Bewegt UIView in NavigationController funktioniert nicht

Ich habe eine UITabBarController enthält eine UINavigationController wo meine UIViewController geschoben wird. Das Ansichtslayout besteht aus einer UITableView und einer benutzerdefinierten UIView, die eine UITextView und eine UIButton enthält.

ich für Tastatur-Benachrichtigungen bin Überwachung, das ist der Code, den ich habe:

override func viewDidAppear(animated: Bool) { 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWillAppear), name: UIKeyboardWillShowNotification, object: nil) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWillDisappear), name: UIKeyboardWillHideNotification, object: nil) 
} 

override func viewDidDisappear(animated: Bool) { 
    NSNotificationCenter.defaultCenter().removeObserver(self) 

} 

func keyboardWillAppear(notification: NSNotification){ 
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() { 
     var frame = inputPanel.frame 
     frame.origin.y = self.view.frame.height - (keyboardSize.height + inputPanel.frame.size.height) 
     inputPanel.frame = frame 
    } 
} 

func keyboardWillDisappear(notification: NSNotification){ 
    var frame = inputPanel.frame 
    frame.origin.y = self.view.frame.height - inputPanel.frame.size.height 
    inputPanel.frame = frame 
} 

Wenn die Tastatur angezeigt wird, ich habe Haltepunkte setzen und sehen, dass die Y-Koordinate aktualisiert wird, aber meiner Ansicht nach bleibt, wo es ist , versteckt hinter der Tastatur.

Ein paar Notizen. Ich verwende IQKeyboardManager und habe die Entfernungsbehandlung für diese Klasse deaktiviert. Ich benutze auch PureLayout zum Auslegen der Steuerelemente innerhalb der benutzerdefinierten UIView. Ich setze keine Einschränkungen für die benutzerdefinierte UIView in der View-Controller. Die Positionen der UITableView und der benutzerdefinierten UIView sind im viewWillLayoutSubview Verfahren wie unten:

override func viewWillLayoutSubviews() { 
    let y = self.view.frame.height - 44 
    self.tableView.frame = CGRectMake(0, 0, self.view.frame.width, y) 
    self.inputPanel.frame = CGRectMake(0, y, self.view.frame.width, 44) 
} 

Auf einer anderen Anmerkung, das funktioniert perfekt in einer anderen Ansicht Ich habe, dass kein Kind eines UINavigationController ist.

Screenshots von dem, was geschieht:

Die Ansicht mit der Eingabeansicht:

view with the input view

Wenn die Tastatur angezeigt wird:

keyboard is shown

Jede Hilfe ist stark geschätzt.

Antwort

0

Versuchen Sie diesen Code viewWillLayoutSubviews-viewDidLoad Funktion

override func viewDidLoad() { 
    super.viewDidLoad() 

    let y = self.view.frame.height - 44 
    self.tableView.frame = CGRectMake(0, 0, self.view.frame.width, y) 
    self.inputPanel.frame = CGRectMake(0, y, self.view.frame.width, 44) 
} 

Ich denke, viewWillLayoutSubviews Funktion zu entfernen, wurden gerufen, nachdem Tastaturereignis tat erscheinen.

0

Versuchen UIKeyboardFrameEndUserInfoKey anstelle von UIKeyboardFrameBeginUserInfoKey

1

Für die Ansichten Sie sind nicht die Anwendung Einschränkungen verwenden, müssen Sie die Auto-Layout-Engine sagen, dass Sie Rahmen vor dem Einstellen ihres Rahmens verwenden werden. Sie können dies tun, indem Sie translatesAutoresizingMaskIntoConstraints auf True setzen. Zum Beispiel:

override func viewWillLayoutSubviews() { 
    let y = self.view.frame.height - 44 
    self.tableView.translatesAutoresizingMaskIntoConstraints = true 
    self.tableView.frame = CGRectMake(0, 0, self.view.frame.width, y) 
    self.inputPanel.translatesAutoresizingMaskIntoConstraints = true 
    self.inputPanel.frame = CGRectMake(0, y, self.view.frame.width, 44) 
} 
+0

Ich habe versucht, dies in vergebens hinzuzufügen. Ich verwende kein Storyboard oder Xib, alle meine Ansichten werden programmatisch erstellt. Wenn ich zu der viewDidLayoutSubviews-Methode wechselte, wurde das untere Panel nicht einmal in der Ansicht – bhmahler

+0

angezeigt. Sie könnten den Code der Initialisierung von tableView und inputPanel veröffentlichen. Sind Sie sicher, dass keyboardWillAppear aufgerufen wird? Geht es in deinen if Block? – beyowulf

+0

Es wird definitiv angerufen. Ich bin durch den Code dort gegangen und sehe, dass der Wert von origin.y geändert wird, aber die Ansicht wird nicht nach oben verschoben.Ich fange an zu glauben, dass dies ein Problem im Zusammenhang mit der Verwendung von PureLayout in der benutzerdefinierten Ansicht sein könnte. – bhmahler

Verwandte Themen