Перемещение 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
Функция была вызвана после того, как на клавиатуре появилось событие.