2016-04-24 2 views
0

OK, donc j'essaye d'implémenter une boîte de commentaire ajouter dans mon vue. Voici la disposition:Déplacement de UIView dans NavigationController ne fonctionne pas

J'ai un UITabBarController contenant un UINavigationController où mon UIViewController est poussé à. La présentation de vue se compose d'un UITableView et d'un UIView personnalisé qui contient un UITextView et un UIButton.

Je surveille les notifications de clavier, voici le code que j'ai:

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 
} 

Lorsque l'écran du clavier, j'ai mis des points d'arrêt et de voir que la coordonnée y est mis à jour, mais mon avis reste là où il est , caché derrière le clavier.

Quelques notes. J'utilise IQKeyboardManager et j'ai désactivé la gestion de distance pour cette classe. J'utilise également PureLayout pour mettre en place les contrôles à l'intérieur de la coutume UIView. Je ne définis aucune contrainte pour le UIView personnalisé dans le contrôleur de vue. Les positions du UITableView et la coutume UIView sont définies dans la méthode viewWillLayoutSubview comme ci-dessous:

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) 
} 

Sur une autre note, cela fonctionne parfaitement dans une autre vue que j'ai ce n'est pas un enfant d'un UINavigationController.

captures d'écran de ce qui se passe:

La vue avec la vue d'entrée:

view with the input view

Lorsque le clavier est indiqué:

keyboard is shown

Toute aide est grandement apprécié.

Répondre

0

Essayez de supprimer ce code viewWillLayoutSubviews-viewDidLoad fonction

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) 
} 

Je suppose que la fonction viewWillLayoutSubviews ont été appelé après clavier ne semble événement.

0

Essayez d'utiliser UIKeyboardFrameEndUserInfoKey à la place de UIKeyboardFrameBeginUserInfoKey

1

Pour les vues que vous ne demandez pas à des contraintes, vous devez indiquer au moteur de mise en page automatique que vous allez utiliser des cadres avant leur mise en cadre. Vous pouvez le faire en définissant translatesAutoresizingMaskIntoConstraints sur true. Par exemple:

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

J'ai essayé d'ajouter cela en vain. Je n'utilise aucun storyboard ou xib, toutes mes vues sont créées par programmation. Lorsque je suis passé à la méthode viewDidLayoutSubviews, le panneau inférieur n'apparaissait même pas dans la vue – bhmahler

+0

Vous souhaiterez peut-être publier le code de l'initialisation tableView et inputPanel. Etes-vous sûr que keyboardWillAppear est appelé? Est-ce que ça va dans votre bloc? – beyowulf

+0

Il est définitivement appelé. J'ai parcouru le code là-bas et voir la valeur d'origine.y être changée, mais la vue ne bouge pas.Je commence à penser que cela peut être un problème lié à l'utilisation de PureLayout dans la vue personnalisée. – bhmahler