Размеры 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. Я отключил его в своем раскадровке, и проблема исчезла. Найдите флажок "Настроить прокрутки" в инспекторе контроллера просмотра и убедитесь, что он не установлен.