2017-01-30 3 views
5

У меня нормальный UITableView в моем UIViewController, ограниченный полноэкранным. Этот tableView имеет пользовательский интерактивный tableHeaderView. TableHeaderView имеет динамический размер и расширяется сам по себе. headerView имеет textField и изменяет свой собственный размер в зависимости от того, имеет ли объект textField фокус или нет.Ячейки, исчезающие во время анимации UITableView

Проблема в том, что ячейки в нижней части экрана не всегда анимируются правильно при изменении размера таблицыHeaderView. Я звоню tableView.beginUpdates() и tableView.endUpdates() после layoutIfNeeded() внутри моего блока анимации. Это должно быть сделано, или клетки не будут следовать за динамическим размером вообще.

Я сделал это gif. Посмотрите конкретно на нижние ячейки во время анимации. Я значительно замедлил анимацию, так что легко увидеть проблему.

gif of problem

Спекуляция: Мне кажется, как и Tableview призывает к cellForRow:indexPath: как только начинается анимация, и как-то узнает, в каком состоянии находится вся Tableview будет после анимации и удаления ненужных клеток, хотя анимация еще не завершена. Точно так же при сглаживании заголовка: самые нижние ячейки не анимируются так же, как и уже загруженные ячейки. Они оживлены с другой анимацией.

Почему это происходит? Можно ли это предотвратить?

Edit: Анимация код

self.navigationController?.setNavigationBarHidden(isEditing, animated: true) 

var frame = tableHeaderView.frame 
frame.size.height = tableHeaderView.headerHeight(forEditing: isEditing) 

UIView.animate(withDuration: 0.3, animations: { 

    if isEditing{ 
     let point = CGPoint(x: 0, y: -self.topLayoutGuide.length) 
     self.tableView.setContentOffset(point, animated: false) 
    }  

    tableHeaderView.frame = frame 
    tableHeaderView.layoutIfNeeded() 
    self.view.layoutIfNeeded() 
    self.tableView.beginUpdates() 
    self.tableView.endUpdates() 
}) { [weak self](completed:Bool) in 
    //Do stuff 
} 
+2

Вы можете показать код? – jalone

+0

В раскадровке - выберите сцену -> показать атрибут-инспектор -> под верхними барами, отвязать в верхней панели. – Pavankumar

+0

@Sti: использование должно иметь общий код. – Poles

ответ

0

Хорошо, я попробую предложить свою версию, но я не могу проверить это, так как я не вижу свой проект. Я не пытался его скомпилировать, поэтому у него могут быть ошибки.

var navFrame = self.navigationController?.navigationBar.frame 
navFrame.origin.y = isEditing ? -navFrame.size.height : 0 

var frame = tableHeaderView.frame 
frame.size.height = tableHeaderView.headerHeight(forEditing: isEditing) 

UIView.animate(withDuration: 0.3, animations: { 
    if isEditing{ 
     let point = CGPoint(x: 0, y: -self.topLayoutGuide.length) 
     self.tableView.contentOffset = point 
    } 

    self.navigationController?.navigationBar.frame = navFrame 

    tableHeaderView.frame = frame 

    self.view.layoutIfNeeded() 
}) { [weak self](completed:Bool) in 
    //Do stuff 
} 
+0

Спасибо, я попробую это, когда у меня будет время попробовать. Один вопрос, однако, почему вручную скрывать navigationBar вместо использования 'self.navigationController? .setNavigationBarHidden (isEditing, animated: true)', как я уже имел? Вы думаете, что это может быть связано с проблемой? – Sti

+0

@Sti Да, возможно, конфликт анимаций. – jesse

0

Я только слышал назад от разработчиков технической поддержки команды компании Apple по этому вопросу, и вот их ответ дословно (курсив мой):

Здравствуйте Nicolas,

Спасибо за связавшись с технической поддержкой Apple Developer (DTS).

Поведение и результирующие ограничения, которые вы описываете, являются конструктивными.

Если вы считаете, что альтернативный подход должен быть рассмотрен Apple, мы рекомендуем вам подать запрос на улучшающего с информацией о , как это проектное решение Воздействия вас, и что вы хотели бы видеть сделать по-разному.

Хотя нет никаких обещаний, что поведение будет изменено, это лучший способ обеспечить, чтобы ваши мысли по этому вопросу видели команда , ответственная за решение.

С наилучшими пожеланиями,

компании Apple Developer Technical Support

Кажется, мы просто застряли с того, чтобы использовать простой вызов либо tableView.setContentOffset(_:animated:) или tableView.scrollToRow(at:at:animated:).

+0

Как бы установитьContentOffset или scrollToRow исправить это? – Sti

+0

Это не так, мы просто застряли в использовании этих стандартных вызовов методов, не имея возможности синхронизировать их с пользовательской анимацией, поэтому команда предлагает нам подать запрос об улучшении. Другими словами, вы можете «исправить» его, переместив свой вызов на любой из этих методов вне блока анимации. – gomollon

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