Перемещение UIView внутри NavigationController не работает

ОК, поэтому я пытаюсь реализовать поле для добавления комментариев на мой взгляд. Вот макет:

у меня есть UITabBarController содержащий UINavigationController где моя UIViewController подталкивается к. Макет просмотра состоит из UITableView и обычай UIView который содержит UITextView и UIButton,

Я отслеживаю уведомления клавиатуры, вот код, который у меня есть:

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
}

Когда клавиатура отображается, я установил контрольные точки и вижу, что координата y обновлена, но мое представление остается там, где оно скрыто, за клавиатурой.

Пара заметок. я использую IQKeyboardManager и отключили дистанционную обработку для этого класса. Я также использую PureLayout для размещения элементов управления внутри таможни UIView, Я не устанавливаю никаких ограничений для пользовательских UIView в контроллере вида. Позиции UITableView и обычай UIView установлены в viewWillLayoutSubview метод, как показано ниже:

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

С другой стороны, это работает отлично, с другой точки зрения, что я не ребенок UINavigationController,

Скриншоты происходящего:

Представление с представлением ввода:

просмотр с вводом

Когда клавиатура показана:

клавиатура показана

Любая помощь с благодарностью.

3 ответа

Для представлений, к которым вы не применяете ограничения, вам нужно сообщить механизму автоматического макета, что вы собираетесь использовать кадры, прежде чем устанавливать их. Вы можете сделать это, установив translatesAutoresizingMaskIntoConstraints к истине. Например:

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

Попробуйте использовать UIKeyboardFrameEndUserInfoKey вместо UIKeyboardFrameBeginUserInfoKey

Попробуйте удалить этот код из viewWillLayoutSubviews в viewDidLoad функция

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

Похоже viewWillLayoutSubviews Функция была вызвана после того, как на клавиатуре появилось событие.

Другие вопросы по тегам