Нежелательная прокрутка при анимации zoomScale в UIScrollView

Executive Summary: Иногда UIScrollView делает нежелательное изменение значения contentOffset, в результате чего приложение отображает неверное место в просматриваемом документе. Нежелательное изменение происходит в сочетании с анимированным изменением масштаба прокрутки zoomScale.

Подробности: . У меня возникают проблемы при увеличении масштаба с помощью CATiledLayer в UIScrollView. Катильщик CATiledLayer удерживает pdf, и когда contentOffset находится в определенном диапазоне, когда я уменьшаю масштаб, то contentOffset изменяется (это ошибка) до того, как произойдет масштабирование. Похоже, что contentOffset изменен в коде Apple.

Чтобы проиллюстрировать проблему, я изменил пример приложения Apple, ZoomingPDFViewer. Код находится на github: https://github.com/DirkMaas/ZoomingPDFViewer-bug

Касание приведет к изменению zoomScale на 0.5, используя aimateWithDuration, таким образом, уменьшая масштаб. Если UIScrollView contentOffset.y меньше 2700 или больше 5900, анимация zoomScale работает нормально. Если касание произойдет, когда между этими двумя значениями окажется contentOffset.y, то анимация contentOffset.y перейдет (не анимированная) примерно на 2700, и тогда произойдет анимация zoomScale, но одновременно с этим произойдет прокрутка, так что когда анимация будет завершена, анимация contentOffset.y окажется там, где она должна быть. Но откуда происходит скачок?

Например, скажем, что contentOffset.y - это 2000, когда нажимается экран: анимация zoomScale работает просто отлично; contentOffset.y не изменяется.

Но если при касании экрана contentOffset.y равняется 4000: contentOffset.y перепрыгнет, без анимации, примерно до 2700, и тогда масштабирование и прокрутка начнутся с этой точки и произойдут в то же время. Когда анимация сделана, то выглядит так, как будто мы увеличили масштаб прямо с 4000, так что мы оказались в правильном месте, но поведение неправильное.

Заметка на интерфейсе пользователя:

  • текст можно прокручивать по вертикали обычным способом
  • текст можно увеличивать и уменьшать, сжимая обычным способом
  • одно нажатие приведет к установке шкалы zoomScale на 0,5; изменение анимировано

Я заметил, что если zoomScale больше 0,5, то прыжок не такой уж большой. Также, если я использую setZoomScale:animated: вместо aimateWithDuration, то ошибка исчезнет, но я не могу ее использовать, потому что мне нужна цепная анимация.

Вот краткое описание того, что я сделал (код в github включает в себя эти изменения):

  • Скачал ZoomingPDFViewer from http://developer.apple.com/library/ios/#samplecode/ZoomingPDFViewer/Introduction/Intro.html и открыл его в XCode
  • Изменённые параметры настройки сборки | Архитектуры | Изменённый базовый SDK для последней версии iOS (iOS 4.3) | GCC 4.2 - Язык | Compile Sources As to Objective-C++
  • удалён TestPage.pdf из проекта
  • добавлен "whoiam 5 24 cropped 3-2". pdf" на его место
  • добавлен PDFScrollView *scrollView; в ZoomingPDFViewerViewController класс
  • изменил loadView в ZoomingPDFViewerViewController для инициализации scrollView вместо sv
  • добавил viewDidLoad, handleTapFrom: Распознаватель и zoomOut до ZoomingPDFViewerViewController в PDFScrollview. m
  • закомментировал scrollViewDidEndZooming:withView:atScale и scrollViewWillBeginZooming:withView:, потому что они делают вещи на фоне изображения, которые отвлекают от рассматриваемой проблемы

Спасибо большое за то, что согласились со мной, и за любую помощь!

9
задан DirkMaas 16 September 2011 в 12:26
поделиться