2016-04-24 5 views
0

ОК, поэтому я пытаюсь реализовать окно комментариев добавления на мой взгляд. Вот макет:Перемещение 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 
} 

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

Несколько нот. Я использую 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.

Снимки экрана происходящего:

Вид с точки зрения ввода:

view with the input view

Когда клавиатура отображается:

keyboard is shown

Любая помощь очень оценили.

ответ

0

Попробуйте удалить этот код из 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 функция была вызвана после клавиатуры действительно появляется событие.

0

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

1

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

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

Я попытался добавить это безрезультатно. Я не использую раскадровку или xib, все мои взгляды создаются программно. Когда я переключился на метод viewDidLayoutSubviews, нижняя панель даже не отображалась в представлении – bhmahler

+0

Возможно, вы захотите опубликовать код инициализации tableView и inputPanel. Также вы уверены, что клавиатураWillAppear получает вызов? Это происходит в вашем блоке if? – beyowulf

+0

Это определенно получилось вызвано. Я прошел через код там и вижу, что значение origin.y изменяется, но представление не перемещается вверх.Я начинаю думать, что это может быть проблема, связанная с использованием PureLayout внутри пользовательского представления. – bhmahler

Смежные вопросы