2013-03-23 2 views
8

Я работаю над приложением для людей с ограниченными физическими возможностями, и при тестировании мы обнаруживаем, что у них много проблем с функциональностью touch-drag по умолчанию.Как изменить чувствительность касания и перетаскивания?

У нас есть экран, в котором есть сетка значков в UIScrollView. Вы можете прикоснуться к значку, чтобы активировать его, и вы можете касатьться в любом месте сетки, в том числе на значке, прокручивать сетку и видеть больше значков.

В iOS поведение по умолчанию заключается в том, что вы касаетесь и перетаскиваете одно движение. Для этого требуется определенная физическая координация, и если вы касаетесь и приостанавливаете и затем перетащите или немного перетащите курс, система рассматривает это как простое касание. Поэтому наши тестеры делают такие вещи, как:

  • Коснитесь, остановитесь на мгновение, а затем попробуйте перетащить. Сетка не прокручивается. Если они пытались прокручивать, перетаскивая значок, когда они отпускают сенсорный экран, он активирует значок.

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

Итак, вопрос: есть ли способ, чтобы переопределить обработку сенсорной для создания большей толерантности к медленности или сопротивлений неточности, так что приложение будет правильно интерпретировать вышеуказанные действия как запросы прокрутки?

+0

Интересный вопрос. Вы можете изменить поведение по умолчанию, но, насколько вы говорите, я не уверен. В Руководстве по обработке событий iOS **, здесь приведен раздел о создании ** Custom Recognizer жестов **, я сам этого не сделал, поэтому я не могу дать полный ответ: http://developer.apple .com/library/ios/# documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizer_basics/GestureRecognizer_basics.html # // apple_ref/doc/uid/TP40009541-CH2-SW34 –

ответ

0

Оказывается, что по умолчанию UIScrollView Прокрутка правильно, но проблема была просто, что если пользователь прикасается к кнопке, кнопка получают сенсорное событие, не Scrollview, и это было Мессинг меня.

Поэтому решение этой проблемы, к которой я пришел, было отключить кнопки, а затем ScrollView получает прикосновение.Затем я использую собственный подкласс UIScrollView, в котором я реализую методы TouchesBegan и TouchesEnded. В этих методах я записываю, где пользователь прикасается вниз и вверх, и если они находятся рядом друг с другом и над (отключенной) кнопкой, я затем выполняю действие, которое делает эта кнопка.

Это прекрасно работает, но я думаю, что это, безусловно, больше работы, чем нужно. Так что, может быть, мой вопрос должен быть: есть ли способ оставить кнопки включенными, но сделать так, чтобы в режиме прокрутки появлялись события касания до его просмотра, прокрутки по желанию, а затем передаются события в подпункты?

+0

См. Мой ответ ниже о методе requireGestureRecognizerToFail :. Я считаю, вы обнаружите, что он дает вам именно то, что вы описываете, без какого-либо подкласса. –

0

Вы можете, конечно, использовать пользовательские средства распознавания жеста и распознавать методы делегата-распознавателя сенсорного жеста, такие как touchDidBegin или shouldRecieveTouch, такие вещи, я не помню их точных формулировок. Просто найдите пользовательские сенсорные жесты распознавания и делегат распознавания жестов касания.

3

Прежде всего, прочитайте this guide полностью, (при необходимости, дважды или трижды), чтобы понять, как построен механизм касания UIkit. Это связано с тем, что связано с тем, что пользователь думает как touch, как события взаимодействуют с базовым оборудованием, что все объекты перехватывают его и как вы можете настроить существующий сенсорный интерфейс UIkit на ваши потребности, по крайней мере концептуально.

Что-то, что привлекло мое внимание, что вы не должны пропустить это this тоже, особенно такие свойства, как timestamp, phase и previousLocationInView. (Я только упоминаю те, которые не очень популярны).

В конце этого, я не знаю, но вы можете в конечном итоге creating your own custom gesture recognizer, который был бы специально для ваших нужд.

UPDATE:

Хотя не совсем относятся к требованию, this хороший старт для начинающих.

+0

Спасибо, это было очень полезно при решении моей проблемы. –

+0

Ну, я говорил слишком быстро. Я могу сделать распознаватель, но тогда мне нужно повторно реализовать * all * прокручивающую логику, которая будет сложной. Не могу ли я повторно использовать распознаватель по умолчанию, но немного подстроить его? –

3

Вы должны использовать UILongPressGestureRecognizer (http://developer.apple.com/library/ios/#documentation/uikit/reference/UILongPressGestureRecognizer_Class/Reference/Reference.html), а также:

  • установить minimumPressDuration к чему-то очень короткий (например, 10)
  • установить allowableMovement к чему-то очень большой (например, 500)

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

Re: прокрутка логики, UIScrollView легко контролировать программно - если вы читаете документы для UIScrollView и всех классов «делегат», вы должны найти все, что вам нужно, чтобы «контролировать» его через обратный вызов жестов вашего UILongPressGestureRecognizer.

NB: вам не нужно писать какие-либо пользовательские GestureRecognizer - UILongPressGestureRecognizer яблок выполняет всю работу за вас и дает вам обратный вызов, когда жест перемещается; вы просто отвечаете на это.

+0

Но не длинное нажатие одного события, а не непрерывное, как движение прокрутки? Как бы вы захватили места прокрутки с помощью долгого нажатия? –

+0

Длительное нажатие является непрерывным событием, пока вы не отпустите свой палец. Это то, что так прекрасно об этом :) – Adam

1

Существует множество способов настройки поведения распознавания жестов без подкласса.

Быстрый способ, который может быть подходящим для некоторых групп населения, состоит в том, чтобы пользователи настраивали настраиваемые жесты в Настройки> Общие> Специальные возможности> AssistiveTouch. Таким образом, например, можно записать вертикальный кастрюлю, который можно использовать, нажав на меню вспомогательного касания, когда он включен.

Остальное предполагает, что вы хотите больше контроля, чем это.

Посмотрите на requireGestureRecognizerToFail:. Этот метод позволит вам определять приоритеты распознавателей жестов без подклассов, так что, например, жест панорамы должен завершиться неудачей до того, как распознается кран.

Распознавания жестов вида прокрутки доступны в качестве свойств в UIScrollView. Вы также можете реализовать UIGestureRecognizerDelegate. Вы можете настроить поведение в любом из трех методов, gestureRecognizerShouldBegin:, gestureRecognizer: shouldReceiveTouch: и gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer:.

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

Для управления очень низким уровнем вы можете подклассифицировать UIApplication или UIWindow, чтобы перехватить сенсорную доставку распознавателям жестов.

Учитывая, что население, на которое вы нацеливаетесь, может не иметь одинаковых возможностей, я бы предложил настроить эти настройки с помощью настроек настроек, чтобы они соответствовали пользователю. Это действительно должен быть набор глобальных настроек, установленных на системном уровне, возможно, в настройках Доступность, о которых я упоминал выше, поэтому я бы посоветовал вам указать ошибку с Apple, в которой были указаны именно то, какие настройки необходимы, и любую справочную информацию, которую вы может обеспечить.

+0

Это полезная информация, но мне нужно приложение просто работать, не требуя настройки, с которой большинство пользователей не будет беспокоиться. –

+0

Прошу еще раз взглянуть на остальную часть моего ответа. Использование предпочтений - это лишь часть предложения; в остальном речь идет о том, как настроить поведение, которое вы хотите. –

Смежные вопросы