2010-06-03 4 views
2

У меня есть представление, которое отображает PDF. Он должен быть масштабируемым, поэтому я также создал UIScrollView, и в его делетете я внедрил viewForZoomingInScrollView, чтобы вернуть вид PDF. Все идет нормально. Однако, когда пользователь достигает края увеличенной страницы PDF, я хотел бы перейти на следующую страницу. Звучит просто, но я не могу понять, как это сделать.Как фильтровать события касания для UIScrollView?

Я пробовал несколько различных подходов:

  1. Использование scrollViewDidScroll для обнаружения, если скроллинг достиг края. Проблема здесь в том, что если zoomScale равен 1, и поэтому прокрутка невозможна, эта функция никогда не вызывается. Но UIScrollView по-прежнему проглатывает все события касания, поэтому я также не могу обнаружить, чтобы достигнуть края в touchphonesMoved. Настройка canCancelContentTouches на NO, когда не масштабируется, не является вариантом, так как это также предотвращает масштабирование.

  2. Подклассификация UIScrollView и пересылка некоторых событий касания в следующий ответчик. К сожалению, когда UIScrollView обнаруживает операцию перетаскивания и отменяет касание, touchsMoved и touchesEnded больше не вызываются даже для подкласса UIScrollView. Опять же, установка canCancelContentTouches на NO не является хорошей, поскольку это также предотвратит некоторые желаемые функции UIScrollView.

  3. Создание прозрачного представления в верхней части прокрутки (как его родного брата), так что этот вид сначала получает все события касания, а затем пересылает некоторые касания в прокрутку. К сожалению, просмотр прокрутки не отвечает на эти вызовы.

  4. Я не могу использовать touchsShouldCancelInContentView, потому что это не приводит к фактическим касаниям в качестве аргумента и не хочет ли я, чтобы представление прокрутки обрабатывало событие касания, также зависит от свойств самого события касания (например, движение касания в направлении, в котором мы уже находимся на краю, не должно отменяться прокруткой, но движение в другом направлении может быть).

Похоже, все, что UIScrollView делает это не инициировано touchesBegan/touchesMoved, но вместо этого он получает некоторые уведомления о прикосновениях пути перед тем этого. Возможно, каким-то недокументированным способом я не могу перехватить и воспроизвести.

Итак, есть ли способ получить уведомление обо всех движениях касания, выполняемых над UIScrollView, при этом все еще имея возможность использовать (при определенных условиях) UIScrollView для масштабирования и прокрутки?

ответ

0

Итак, вот что я сделал в конце:

  • Оставив все прокрутка и масштабирование до UIScrollView и обработки перелистывания страниц в UIScrollViewDelegate в scrollViewDidEndDragging: willDecelerate: это почти решение, за исключением того, что эта функция никогда не вызывается, если все содержимое отображается на экране, поэтому перетаскивание/прокрутка невозможно.
  • В этом случае выступы обрабатываются в приложениях ViewControllerBegan/touchesEnded, но для этого необходимо убедиться, что UIScrollView не отменяет эти события. Однако в других случаях UIScrollView должен иметь возможность отменять касания, чтобы он мог выполнять масштабирование и прокрутку.
  • UIScrollView должен быть в состоянии отменить штрихи, если:
    • скроллинга можно (и нужно), потому что все содержимое не помещается на экране (zoomScale> 1 в моем случае), ИЛИ
    • пользователь коснулся экрана двумя пальцами, так что увеличение и уменьшение масштаба работы.
  • Если прокрутка невозможна, и пользователь коснулся экрана одним нажатием, то касания не должны отменяться, а сенсорные события должны быть перенаправлены на контроллер вида.

  • Итак, я создал подкласс UIScrollView.

  • Этот подкласс имеет свойство, указывающее на ViewController.
  • Используя методы touchXXX, я отслеживаю текущий подсчет очков.
  • Я пересылаю все события касания к ViewController.
  • И, наконец, я переопределен touchesShouldCancelInContentView :, и вернуть NO, когда zoomScale < = 1 и touchCount == 1.
Смежные вопросы