iPhone — ловить горизонтальные свайпы — перед — подзаголовком

У меня есть вид, который может вернуться к предыдущему виду.

Допустим, это анкета. Таким образом, мой основной вид — это анкета (Контроллер), и у него есть подвид, который показывает вопрос с двумя возможными ответами. Когда кто-то отвечает на вопрос, он нажимает «Далее», и анкета (Контроллер) показывает следующий вопрос в этом конкретном подвиде. Просто, верно?

Хорошо, а теперь представьте, что вам нужно разместить до 10 ответов на конкретный вопрос. Это потребует реализации прокрутки в подвиде, чтобы разместить вопрос + все ответы.

Теперь мой вопрос: я хочу, чтобы анкета View (контроллер) получала уведомление о горизонтальных пролистываниях (следующий/предыдущий вопрос), но я хочу, чтобы все остальные касания (нажатия для радиокнопок ответов и вертикальные прокрутки для просмотра прокрутки) проходили. ..

Любая идея, как это сделать? Я пробовал около 5 различных подходов и сломал себе голову и мотивацию по каждому из них: / Последний (и самый простой) просто добавлял еще одно подпредставление в анкету (Контроллер), накладывая представление вопрос + ответ.

Это любезно улавливает все прикосновенияBegan/Moved/Ended/Cancelled для меня, но даже если я просто помещу вперед в -каждом из этих методов ([self nextResponder]...) базовое представление (с ответами и прокруткой ) больше не отвечаю...

Я немного запутался в этом и думаю когда-нибудь написать свой собственный Scrollview, поскольку UIScrollView — самый ужасный монстр, с которым сталкиваются разработчики iPhone: P

Имейте в виду, что я поддерживаю iPhone OS 3.0 и выше, поэтому новые API-интерфейсы жестов не нужны.


person e75deaf2-fb2a-43e0-91ba-6caad0    schedule 12.08.2010    source источник


Ответы (1)


Я не уверен, что вы подразумеваете под «вперед в каждом из этих методов». Я не уверен, что nextResponder - это то, на что их нужно пересылать.

Проблема в том, что касания должны «принадлежать» одному представлению на протяжении всей их жизни. Я не уверен, как реализованы UIScrollView или распознаватели жестов, но я почти уверен, что они делают больше, чем вы должны делать самостоятельно.

Я бы заменил hitTest:withEvent: в анкетеView на return self. В вашем touchesBegan:withEvent: вызовите [super hitTest:[touch locationInView:self] withEvent:event] и сохраните подпредставление, которое «владеет» им. В touchesMoved:withEvent: перенаправьте касание в соответствующее подпредставление, но если вы обнаружите жест, «забудьте» подпредставление, которому принадлежит касание, и вместо этого вызовите touchesCancelled:withEvent:. В touchesEnded/Cancelled:withEvent: перенаправьте его в подпредставление, а затем забудьте о владеющем подпредставлении.

Это неприятно, но в основном работает. Некоторые вещи становятся неправильными (с точки зрения подвидов):

  • -[UIEvent touchesForView:] вернет QuestionnaireView.
  • UITouch.view вернет QuestionnaireView
  • UITouch.phase может не быть UITouchPhaseCancelled в touchesCancelled:withEvent: (если вы обнаружите жест и отмените касание). *
person tc.    schedule 12.08.2010
comment
Я пока не могу заставить его работать, пока это мой код: pastebin.com/V4eZQj90. Моя проблема в том, что touchesEnded страдает от вечного цикла, хотя я проверяю, не равен ли UIView nextResponder самому себе... - person e75deaf2-fb2a-43e0-91ba-6caad0; 13.08.2010
comment
Мне кажется, все в порядке. Какие петли? Также обратите внимание, что если вы хотите поддерживать мультитач, вам нужно будет сохранять следующего респондента для каждого касания отдельно. - person tc.; 13.08.2010