Есть ли способ узнать, когда представление доступно для просмотра пользователю? - PullRequest
0 голосов
/ 13 апреля 2010

Есть ли способ узнать, когда представление доступно для просмотра пользователю?

Например: если у меня есть 2 вида, и один из них «скрывает» другой -

как мне узнать, что "скрытый" вид в настоящее время не виден на экране,

и как я могу проверить, когда он снова станет видимым?

Спасибо.

Ответы [ 3 ]

1 голос
/ 13 апреля 2010

Я предполагаю, что вы имеете в виду два вида в одном окне. Если представления рисуют вне своих рамок, что может делать любое представление, когда clipsToBounds имеет значение NO, тогда вам необходимо получить истинные ограничивающие рамки содержимого представления.

Если у вас есть два вида с одним и тем же родительским видом и вы хотите увидеть, пересекаются ли они, вы можете использовать следующее:

CGRect frame1 = [view1 frame];
CGRect frame2 = [view3 frame];
CGRectIntersectsRect( frame1 , frame2 );

Если два представления не имеют одного и того же родителя, вам нужно найти общего родителя обоих представлений и использовать:

CGRect frame1 = [parent convertRect:[view1 frame] fromView:view1];
CGRect frame2 = [parent convertRect:[view2 frame] fromView:view2];

Если вы хотите знать, полностью ли перекрываются представления, вместо того, чтобы немного перекрываться, используйте это вместо CGRectIntersectsRect:

CGRectContainsRect( frame1 , frame2 ) || CGRectContainsRect( frame2 , frame1 )

Если два вида не являются непрозрачными, то даже если их рамки пересекаются, содержимое видов не может. Выяснение этого полностью зависит от конкретного содержания представлений.

Как только вы выяснили, что представления перекрываются, вы можете выяснить, какое из них сверху, изучив [родительские подпредставления] и увидев, какое представление имеет более высокий индекс. Если любое из представлений не является прямым подпредставлением родителя, вы можете просмотреть подпредставления и использовать isDescendantOfView, чтобы найти порядок.

Чтобы выяснить, является ли представление вообще скрытым, вы бы сравнили его с любым другим представлением, имеющим более высокий z-порядок. Порядок z представления совпадает с индексом в массиве подпредставлений, поэтому подпредставление в индексе 2 имеет более высокий порядок z, чем подпредставление в индексе 1. Начните с родительского представления, затем поднимитесь по иерархии представления.

0 голосов
/ 13 апреля 2010

Я придумал способ, и если он сработает, я это прокомментирую -

Получив все представления "выше" меня в иерархии представлений,

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

Надеюсь, это сработает

0 голосов
/ 13 апреля 2010

UIView's

– viewWillAppear:

Уведомляет контроллер представления о том, что его представление должно стать видимым. Это означает, что каждый раз, когда ваше представление собирается появиться, этот метод будет вызываться автоматически

таким же образом

- (void)viewWillDisappear:(BOOL)animated

метод делегата будет автоматически вызываться, когда представление собирается быть закрыто, закрыто или иным образом скрыто от представления (непосредственно перед тем, как оно скрывается)

...