iPhone - Поймай горизонтальные пролистывания - PullRequest
0 голосов
/ 12 августа 2010

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

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

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

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

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

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

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

Обратите внимание, я поддерживаю iPhone OS 3.0 и более поздние версии, поэтому новые API-интерфейсы жестов не нужны.

1 Ответ

1 голос
/ 12 августа 2010

Я не уверен, что вы имеете в виду под "передовой в этих методах".Я не уверен, что nextResponder - это то, что нужно для пересылки.

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

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

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

  • - [UIEvent touchesForView:] вернет вид вопросника.
  • UITouch.view вернет вид вопросника
  • UITouch.phase может быть не UITouchPhase Отменено в касаниях Отменено: сEvent: (если вы обнаружите жест и отмените касание).*
...