Цель C: Можно ли установить subview как firstResponder?

У меня возникла ситуация, когда я добавляю представление из другого диспетчера представлений в существующий диспетчер представлений. Например:

//set up loading page
self.myLoadingPage = [[LoadingPageViewController alloc]init ];
self.myLoadingPage.view.frame = self.view.bounds;
self.myLoadingPage.view.hidden = YES;
[self.view addSubview:self.myLoadingPage.view];

Можно ли установить "self.myLoadingPage" первым ответчиком? Это тот случай, когда размер представления загрузочной страницы не охватывает весь размер существующего представления, и пользователи могут все еще взаимодействовать с супервидом (что не является желаемым поведением). Я хочу просто включить subview в этом случае.

3 ответа

Интересный вопрос. Я нашел аналогичный пост с цитатой от Форумы разработчиков Apple по этой проблеме:

Чтобы действительно сделать это представление единственным на экране, который может получить штрихи вам нужно либо добавить другое представление над всем остальным поймать остальные касания или подкласс a где-то в вашей иерархии (или ваш UIWindow сам) и переопределить hitTest: withEvent: всегда возвращать ваш текстовый вид, когда он виден, или вернуть нуль для прикосновений не в вашем текстовый вид.

Это, по-видимому, указывает на то, что нет четкого простого решения (если не было изменений API в отношении этого, сделанного после октября 2010 года.)

В качестве альтернативы, я полагаю, вы могли бы пройти через все остальные subviews в своем superview и индивидуально установить свои свойства userInteractionEnabled на NO (но это, вероятно, окажется более громоздким, чем цитируемые решения).

Мне бы хотелось увидеть другие способы, чтобы это разрешить.


Самое простое решение - переопределить метод hitTest в вашем загрузочном представлении, чтобы вернуть TRUE. Этот вид сверху является первым в цепочке ответчиков, метод hitTest получает вызов, который NORMALLY возвращает TRUE, если точка находится внутри представления и поэтому будет обрабатываться, возвращая TRUE независимо от того, что вы получаете событие касания и эффективно блокируете сообщение, вызываемое на следующий ответчик.


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

licensed under cc by-sa 3.0 with attribution.