Размеры UITableViewWrapperView и UITableView отличаются с автозапуском
Я создаю чат. Все выглядит вполне нормально, но я столкнулся с проблемой "багги".
Я получил UIViewController с панелью UITextView для ввода сообщения и UITableView.
Они находятся в этом ограничении: "V:|-(64)-[chatTable][sendMessageBar]-(keyboard)-|"
.
Когда клавиатура не выключена - константа этого ограничения равна 0
. и после того, как клавиатура выключена - я увеличиваю константу до высоты клавиатуры.
когда клавиатура не выключена:
self.table.contentSize = (375.0,78.5)
self.table.bounds = (0.0,-490.0,375.0,568.5)
self.table.frame = (0.0,64.0,375.0,568.5)
self.table.subviews[0].frame (UITableViewWrapperView) = (0.0,0.0,375.0,568.5)
self.table.subviews[0].frame (UITableViewWrapperView) = (0.0,0.0,375.0,568.5)
и когда клавиатура выходит:
self.table.contentSize = (375.0,78.5)
self.table.bounds = (0.0,-274.0,375.0,352.5
self.table.frame = (0.0,64.0,375.0,352.5)
self.table.subviews[0].frame (UITableViewWrapperView) = (0.0,-137.5,375.0,137.5)
self.table.subviews[0].frame (UITableViewWrapperView) = (0.0,0.0,375.0,137.5)
Таким образом, UITableViewWrapperView, после увеличения констант ограничений, отличается по размеру его супервизором - UITableView. Есть ли способ исправить это? Я бы предположил, что UITableViewWrapperView
изменит свой фрейм и границы в соответствии с UITableView
, но это не так.
Любые идеи, где проблема или как я могу обойти это?
ДОБАВЛЕНИЕ:
После еще нескольких исследований - кажется, что это происходит где-то между viewWillLayoutSubviews
и viewDidLayoutSubviews
. Это довольно странно:
override func viewWillLayoutSubviews() {
println("WrapperView Frame :991: \(self.table.subviews[0].frame)") \\ WrapperView Frame :991: (0.0,0.0,375.0,568.5)
super.viewWillLayoutSubviews()
println("WrapperView Frame :992: \(self.table.subviews[0].frame)") \\ WrapperView Frame :992: (0.0,0.0,375.0,568.5)
}
override func viewDidLayoutSubviews() {
println("WrapperView Frame :6: \(self.table.subviews[0].frame)") \\ WrapperView Frame :6: (0.0,-137.5,375.0,137.5)
super.viewDidLayoutSubviews()
println(">> viewDidLayoutSubviews")
}
Итак, кажется, что что-то происходит там, что беспорядок UITableViewWrapperView
Ответы
Ответ 1
Кажется, что это ошибка (борьба с этой ошибкой заняла целый день для меня)
Наконец этот обход помог:
for (UIView *subview in tableView.subviews)
{
if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewWrapperView"])
{
subview.frame = CGRectMake(0, 0, tableView.bounds.size.width, tableView.bounds.size.height);
}
}
Ответ 2
Следующее исправлено для меня:
func fixTableViewInsets() {
let zContentInsets = UIEdgeInsetsZero
tableView.contentInset = zContentInsets
tableView.scrollIndicatorInsets = zContentInsets
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
fixTableViewInsets()
}
Я обнаружил, что в viewWillAppear() все вставки были равны 0. Но в viewDidAppear() они были изменены, видимо, смещены для панели навигации и т.д. Это делает UITableViewWrapperView отличным от UITableView.
Я изменил вставки в своей собственной рутине, так что было легче экспериментировать с ее вызовом из разных мест. ViewWillLayoutSubviews() позволяет ему быть измененным перед представлением - размещение изменения в viewDidAppear() заставило таблицу поддразнивать.
Ответ 3
Я столкнулся с этим сегодня, и хотя исправление, предлагаемое @anorskdev, прекрасно работает, кажется, что основной причиной проблемы является свойство automaticallyAdjustsScrollViewInsets
UIViewController, которое по умолчанию равно true
. Я отключил его в своем раскадровке, и проблема исчезла. Найдите флажок "Настроить прокрутки" в инспекторе контроллера просмотра и убедитесь, что он не установлен.