Требуется объяснение цепочки ответа UIR - PullRequest
1 голос
/ 14 июня 2011

У меня проблемы с тем, чтобы мои UIButtons, UIScrollViews и т. Д. Работали в этой ситуации:

У меня есть база UIViewController, которая является корневым контроллером UIWindow.Над этим слоем у меня есть еще несколько UIViews, которые я назову «Представлением среднего уровня».А сверху у меня есть еще один UIView, добавленный для наложенных объектов.

Вид среднего слоя регулярно меняется для разных видов.Используемый UIView взят из UIViewController, созданного файлом NIB.Вот пример

if ( mode == eModeShowView1 )
    UIViewController* nextController = [[UIViewController alloc] initWithNibName:@"View1"...
else if ( mode == eModeShowView2 )
    UIViewController* nextController = [[UIViewController alloc] initWithNibName:@"View2"...

[UIView insertSubview:nextController.view below:m_overlayView];

Теперь, когда я касаюсь экрана, первым респондентом, очевидно, является OverlayView или любой UIResponder на OverlayView, который был затронут.UIEvent сенсорного ввода идет вверх по цепочке просмотра, но, похоже, пропускает просмотр среднего уровня и UIResponders на этом UIView в целом.Он прыгает прямо к корню UIViewController.

Кто-нибудь знает, что здесь происходит?

Можно ли решить эту проблему, создав два UIEvents?Один для вида наложения и один для вида среднего слоя?Это возможно?Если да, то как?

Любая помощь будет наиболее ценной.Спасибо, Рич

1 Ответ

0 голосов
/ 14 июня 2011

edit1 start:

вы можете поместить UITapGestureRecognizer в m_overlayView и initWithTarget: действие your-middleview: some-method-in-middleview

Теперь в вашем middleview вы можете идентифицировать распознаватель.state как UIGestureRecognizerStateBegan, Ended и т. д. и делать то, что вы хотите сделать.

edit1 end:

Вы можете отладить его.Просто используйте логи touchesbegan на всех ваших контроллерах.По логам будет понятно последовательность сенсорных ответов.

Хорошо ... так что это описание метода из документации может вам ответить.Ваши m_overlayView и nextController.view относятся друг к другу как братья и сестры, а не как супервизоры.Таким образом, ваше прикосновение к одному из них будет сообщено не другому, а основанию superview, которое является общим superview для обоих братьев и сестер.

Следовательно, вы получаете, что средний слой обойден.На самом деле ваш средний уровень - это брат, а не супервизор.Надеюсь, что, по крайней мере, это даст вам некоторый путь вперед;)

insertSubview:belowSubview:

Вставляет представление под другим представлением в иерархию представлений.

(void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview

Параметры :

view

Вид для вставки под другим видом.Он удаляется из superview, если он не является родным братом siblingSubview.

siblingSubview :

Родственный вид, который будет выше вставленного вида.

Обсуждение :

Этот метод сохраняет представление и устанавливает следующий респондент для получателя, который является его новым superview.

Представления могут иметь только одно суперпредставление.Если представление уже имеет superview и это представление не является получателем, этот метод удаляет предыдущий superview перед тем, как сделать получатель новым superview.

...