2017-01-04 2 views
0

Я столкнулся с этой странной проблемой при разработке универсального приложения iOS. Мое приложение выглядит довольно просто. У корня у меня есть UITableViewController. Первая вкладка содержит UISplitViewController. Ведущий UISplitViewController является UINavigationController с UITableViewController, а деталь - UINavigationController с UITableViewController.UISplitViewControllers DetailViewController имеет неправильный контентInste.bottom, когда MasterViewController находится в режиме поиска

Кроме того, в представлении главной таблицы есть строка поиска в ее tableHeaderView, которую я использую для фильтрации записей. Это все работает, как ожидалось, но я вижу один вопрос появляется на устройствах, где UISplitViewController показывает мастер и детализацию в то же время (например, IPad или большой iPhone экран:

ПРОБЛЕМА: Когда клавиатура активна в строке поиска от хозяина, tableView из деталей имеют неправильного contentInset.bottom

Причина:. Я использую tableView.contentInset.top и tableView.contentInset.bottom вместе с tableView.bounds.height для вычисления высоты карты клеток в tableView(_:heightForRowAt:) в зависимости от того, сколько других клеток я отображающей

.

Я отлаживал его и, как правило, вставка .top равна 64, а .bottom - это 49, которые являются ожидаемыми значениями для строки состояния + навигационной панели и панели табуляции. Однако, когда клавиатура активна в панели поиска, вставка .bottom становится 104, которая является 49 из табеля PLUS 55 панели инструментов клавиатуры. Как вы можете видеть, панель инструментов клавиатуры накладывает вкладку и не просто сдвигает ее, и я думаю, что tableview неправильно вычисляет свою вставку .bottom.

ВОПРОС: Что я должен сделать так, чтобы tableView.contentInset.bottom является 0, когда нет TabBar, 49, если есть TabBar и 55, если есть панель инструментов наложения TabBar?

See how the map is shifted up when the keyboard toolbar is enabled?

Посмотрите, как карта сдвигается вверх, когда панель клавиатуры включена? Это происходит потому, что в tableView(_:heightForRowAt:)tableView.contentInset.bottom составляет 104 вместо 55.

Does not happen when the keyboard is not active

Если клавиатура не активна/Searchbar не сфокусирован, tableView.contentInset.bottom возвращается правильный высоту 49.

ответ

0

UPDATE

Оказалось, что в IQKeyboardManager произошла ошибка. После недавнего обновления библиотеки все вернулось к нормальной работе и работало, как ожидалось, даже без обработки каких-либо клавиатурных уведомлений, которые мне очень нравятся.

ОРИГИНАЛЬНЫЙ ОТВЕТ

мне удалось обойти эту проблему путем регистрации уведомлений UIKeyboard и вручную изменения tableViews scrollViewInsets и contentInsets так:

func viewDidLoad(){ 
    ... 
    let center = NotificationCenter.default 
    center.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: .UIKeyboardWillShow, object: nil) 
    center.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: .UIKeyboardWillHide, object: nil) 
} 

func keyboardWillShow(_ notification: Notification) { 
    guard let userInfo = notification.userInfo else { return } 
    guard let endFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else { return } 
    let duration:TimeInterval = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0 
    let animationCurveRawNSN = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber 
    let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIViewAnimationOptions.curveEaseInOut.rawValue 
    let animationCurve:UIViewAnimationOptions = UIViewAnimationOptions(rawValue: animationCurveRaw) 

    self.keyboardHeight = endFrame.size.height 
    self.tableView.contentInset.bottom = endFrame.size.height 
    self.tableView.scrollIndicatorInsets.bottom = endFrame.size.height 

    let animations:() -> Void = { 
     self.tableView.beginUpdates() 
     self.tableView.endUpdates() 
     self.view.layoutIfNeeded() 
    } 

    UIView.animate(withDuration: duration, 
        delay: TimeInterval(0), 
        options: animationCurve, 
        animations: animations, 
        completion: nil) 
} 

func keyboardWillHide(_ notification: Notification) { 
    guard let userInfo = notification.userInfo else { return } 
    let duration:TimeInterval = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0 
    let animationCurveRawNSN = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber 
    let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIViewAnimationOptions.curveEaseInOut.rawValue 
    let animationCurve:UIViewAnimationOptions = UIViewAnimationOptions(rawValue: animationCurveRaw) 

    self.keyboardHeight = 0.0 
    self.tableView.contentInset.bottom = 49.0 
    self.tableView.scrollIndicatorInsets.bottom = 49.0 

    let animations:() -> Void = { 
     self.tableView.beginUpdates() 
     self.tableView.endUpdates() 
     self.view.layoutIfNeeded() 
    } 

    UIView.animate(withDuration: duration, 
        delay: TimeInterval(0), 
        options: animationCurve, 
        animations: animations, 
        completion: nil) 

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