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 включает в себя эти изменения):
PDFScrollView *scrollView;
в ZoomingPDFViewerViewController
класс loadView
в ZoomingPDFViewerViewController
для инициализации scrollView
вместо sv
viewDidLoad
, handleTapFrom: Распознаватель
и zoomOut
до ZoomingPDFViewerViewController
в PDFScrollview. mscrollViewDidEndZooming:withView:atScale
и scrollViewWillBeginZooming:withView:
, потому что они делают вещи на фоне изображения, которые отвлекают от рассматриваемой проблемыСпасибо большое за то, что согласились со мной, и за любую помощь!