2014-11-06 8 views
1

Давайте назовем этот подкласс UIView - SomeClass. Этот SomeClass является частью статической библиотеки. Некоторые клиенты будут использовать эту библиотеку и добавят экземпляры этого SomeClass в ячейки своего (настольного) табличного представления.Определение видимой части (фрейма) подкласса UIView, которое добавляется в виде представления в ячейку в виде таблицы

I (SomeClass) необходимо определить, когда экран SomeClass «входит» в экран (станет видимым), и когда экран «выйдет» (станет невидимым).

Я могу использовать метод didMoveToWindow:, а затем проверить self.window для nil. НО, есть проблема, SomeClass получает это событие, прежде чем оно на самом деле видно, из-за того, что клетки «готовятся» по представлению таблицы. И я должен знать наверняка, это на 100% видно для некоторых пользователей.

  1. Один из способов определения - использование scrollViewDidScroll:. Предположим, что SomeClass получит представление прокрутки, используя итерацию в супер-представлениях и подпишет как делегат для поиска прокрутки. Но он будет удален какой-то ячейкой, которая будет подписываться как делегат для просмотра прокрутки. Поэтому мне нужно придумать для этого какое-то решение. Например, в Android есть возможность добавить наблюдателя, в этом случае SomeClass всегда является слушателем и не отменяет никакого другого слушателя. В Android существует множество отношений, а не iOS, один к одному.

  2. В другом случае, я могу включить некоторый таймер в didMoveToWindow:, когда SomeClass становится видимым, что будет проверять каждое X-время, его кадр. Таймер будет отключен, когда SomeClass перейдет с экрана.

  3. Возможно, есть способ проверить на низком уровне, не используя прокрутку и таймер на некотором низкоуровневом методе перерисовывания. Является ли это возможным?

Итак, что является лучшим (будет использовать меньше ресурсов/хороший дизайн)?

+0

Вы прочитали это сообщение? http://stackoverflow.com/questions/2453457/iphone-howto-get-notified-when-an-uiview-becomes-visible – rbd

ответ

0

Вы можете использовать CGRectIntersectsRect, чтобы проверить, пересекается ли кадр ячейки с кадром вашего пользовательского представления. Кроме того, didMoveToWindow - это метод, который вы ищете.

Если, как вы говорите, ячейка просмотра таблицы всегда будет иметь SomeClass в качестве подсмотра, тогда было бы разумнее использовать UITableViewDelegate tableView:willDisplayCell:forRowAtIndexPath:.

+0

Кадр SomeClass всегда пересекает рамку ячеек, он добавляется как подзаголовок. – Nikita

+0

Вы читали мой вопрос? Я описал что-то о didMoveToWindow – Nikita

+0

В этом случае отвлеките логику из своего вида и проверьте, будет ли отображаться представление, когда отображается ячейка - см. Мое редактирование. – KerrM

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