Очень странное поведение UITableView tableFooterView

Я пытаюсь добавить простой вид нижнего колонтитула для всей таблицы из пера в свой UITableView, но по какой-то причине нижний колонтитул всегда отображается на одну строку выше, а кнопки вообще не реагируют на нажатия (фактически касание на самом деле проходит прямо в ячейку за кнопкой):

введите здесь описание изображения

Я не могу понять, почему нижний колонтитул не находится в правильном месте. Я явно учел его высоту в размере UIPopoverController, в котором он содержится.

Вот как я создаю/добавляю представление нижнего колонтитула:

self.tableFooterView = [[NSBundle mainBundle] loadNibNamed:@"ModifierFooterView" owner:self options:nil][0];
self.tableView.tableFooterView = self.tableFooterView;

Обновление: кнопки привязаны к нижнему левому и нижнему правому углам соответственно:

введите здесь описание изображения

Также для подсказки я попытался установить весь фоновый цвет нижнего колонтитула на ярко-зеленый. Как вы можете видеть на предыдущем снимке экрана, он нигде не отображается зеленым цветом.

Обновление 2: при регистрации значений кадра представления нижнего колонтитула во время загрузки его из пера после установки его в качестве нижнего колонтитула таблицы оно имеет правильное значение Y, которое поместит его сразу после последнего строка. Единственное немного странное чтение — это ширина 768 вместо ширины родительского представления.

Обновление 3: оказалось, что проблема вызвана тем, что загруженное представление нижнего колонтитула каким-то образом устанавливает высоту кадра на 0 где-то. Я до сих пор не понял, где/почему это происходит, но если я явно верну его на 50, когда представление вот-вот появится, все будет работать правильно, так что это больше не будет серьезной проблемой. Однако, если у кого-то есть понимание того, почему это происходит, пожалуйста, напишите ответ.


person devios1    schedule 31.08.2013    source источник
comment
Попробуйте проверить (и сделать recursiveDescription) после того, как макет был обновлен в соответствии с последним комментарием в моем ответе. Вероятно, вы видите 768, потому что это ширина, указанная в Interface Builder.   -  person Timothy Moose    schedule 01.09.2013


Ответы (1)


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

Наиболее вероятная причина заключается в том, что когда представление вставляется в таблицу, ему присваивается меньшая высота, чем в макете XIB, в результате чего стойки и пружины кнопок (или ограничения автоматического макета) толкают их вверх. Так что вам просто нужно отрегулировать стойки и пружины (или ограничители). Если вы можете поделиться более подробной информацией о вашем макете, я могу дать вам более конкретные инструкции.

person Timothy Moose    schedule 31.08.2013
comment
Я уже подумал об этом и установил привязку кнопок к нижней части представления (выключил автоматическую раскладку). Смотрите мое обновление. - person devios1; 01.09.2013
comment
Попробуйте поставить точку останова в контроллере представления и выполнить [self.tableFooterView recursiveDescription] в консоли. Вы можете получить подсказку, увидев фрейм нижнего колонтитула и иерархию представлений. - person Timothy Moose; 01.09.2013
comment
Это не общедоступный API. Просто введите это в консоли, и все заработает: po [self.view recursiveDescription]. Возможно, переопределите viewDidLayoutSubviews и сделайте это там. Или вы можете сделать свой нижний колонтитул настраиваемым представлением и отлаживать его там. Например, переопределите layoutSubviews (где вы просто делаете [super layoutSubviews]). Это дает вам возможность установить точку останова непосредственно в конфигурации вашего представления. - person Timothy Moose; 01.09.2013
comment
Оказывается, проблема заключалась в том, что высота представления где-то была установлена ​​​​на 0, хотя в xib она четко указана как 50. Если я явно верну его на 50 в viewWillAppear, он будет работать нормально. Действительно очень странно. Я хотел бы добраться до сути этого, но сейчас у меня есть другие приоритеты, на которых нужно сосредоточиться. - person devios1; 02.09.2013