Как я могу определить, находится ли UIView впереди (видимый)? - PullRequest
7 голосов
/ 12 апреля 2009

Мне нужно определить, какой вид спереди (виден в данный момент). Как я могу это сделать?

Вот что я хотел бы сделать:

if ( ! <<methodToTellIfViewAIsInFront>>) {
  [viewA prepareToDisplay];
  [window bringSubviewToFront: viewA];
}

Ответы [ 7 ]

13 голосов
/ 12 апреля 2009

У UIView не обязательно есть понятие быть впереди. UIWindows может быть ключевым или нет, но это не совсем то же самое.

Вы можете перенести вид на спереди, но это не значит, что он виден или не виден. Помните, что представления могут быть любого размера.

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

Я думаю, что вы хотите сделать, это проверить подпредставления NSArray вашего суперпредставления или UIWindow и проверить это. Я не могу вспомнить, какой фронт, но это либо первый, либо последний объект.

Подвиды нарисованы по методу художника. Виды отображаются в порядке от самого дальнего к ближайшему, а последний нарисованный объект - «фронт».

4 голосов
/ 29 октября 2015

Следующее вернет YES, если viewA находится впереди:

[[viewA.superview.subviews lastObject] isEqual: viewA]
3 голосов
/ 22 ноября 2012

Проверьте, если [UIView.window isKeyWindow] == ДА

3 голосов
/ 27 мая 2010

Добавьте это для просмотра контроллера:

- (void)viewDidAppear:(BOOL)animated {
 [super viewDidAppear:animated];
 visible = YES;
}

- (void)viewWillDisappear:(BOOL)animated {
 visible = NO;
 [super viewWillDisappear:animated];
}

и отметьте «видимый» ивар

1 голос
/ 28 июня 2018

Ответ @LucasChwe в Swift 4

if viewA.superview?.subviews.last == viewA { 'viewA is visible to user'}
0 голосов
/ 26 июля 2013

При работе с модальными представлениями этот код работал со мной в моем контроллере корневого представления:

 if(self.view == [(MyAppDelegate *)[[UIApplication sharedApplication] delegate].window.subviews objectAtIndex:0]){ ... 
          // stuff here 
     }
0 голосов
/ 12 апреля 2009

Единственный способ сделать это - назначить уникальный вид вашему представлению, используя [тег UIView], а затем использовать [UIView viewWithTag], чтобы вывести его на передний план.

Или вы можете найти нужное представление с помощью тега и поработать с ним ..

for (UIView *checkView in [self.view subviews] ) {
      if ([checkView tag] == whatever) {
      // Do Whatever you need to do
      }
}

.. тогда принесите это вперед.

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...