Необходимо объяснение цепочки URESPONDER
-
27-10-2019 - |
Вопрос
У меня проблемы с получением 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
? Один для оверлейного представления и один для вида среднего слоя? Это возможно? Если да, то как?
Любая помощь будет наиболее оценена. Спасибо, Рич
Решение
Edit1 Start:
Вы можете поместить uitapgesturerecognizer в m_overlayview и initwithtarget: your-middleview Действие: некоторые методики-в-средне
Теперь, в вашем Middleview вы можете идентифицировать распознавание. Штат как uigesturerecognizerStatebegan, Condated и т. Д. И делать то, что вы хотите.
EDIT1 END:
Вы можете отладить это. Просто используйте журналы touchesbegan
во всех ваших контроллерах. Это будет ясно журналом последовательности сенсорных ответов.
ОК .. так что это описание метода из документации может ответить вам. Ваш m_overlayView
а также nextController.view
относятся друг к другу как о братьев и сестрах, а не надзором. Таким образом, о вашем прикосновении к любому из них не будет сообщено не другим, а вместо базы superview
что является обычным superview
обоим братьям и сестрам.
Следовательно, вы понимаете, что средний слой обходится. На самом деле ваш средний слой-это брат, а больше не является надзором. Надеюсь, что, по крайней мере, даст вам путь вперед;)
insertSubview:belowSubview:
Вставьте представление ниже другого представления в иерархию просмотра.
(void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview
Параметры:
view
Представление, чтобы вставить ниже другого представления. Он удален с его superview
Если это не родственник сестер.
сестры:
Вид и сестры, который будет выше вставленного представления.
Дискуссия:
Этот метод сохраняет представление и устанавливает свой следующий ответ на приемник, который является его новым superview
.
Просмотры могут иметь только один надзор. Если View уже имеет superview
и этот вид не является приемником, этот метод удаляет предыдущий superview
Прежде чем сделать приемник новым superview
.