У меня есть подробное обсуждение того, как (и почему) работает масштабирование UIScrollView на github.com / andreyvit / ScrollingMadness / .
(Ссылка также содержит описание того, как программно масштабировать UIScrollView, как эмулировать пейджинг в стиле библиотеки фотографий + масштабирование + прокрутка, пример проекта и класс ZoomScrollView, который включает в себя некоторые из методов магии масштабирования.)
Цитата:
UIScrollView не имеет понятия «текущий уровень масштабирования», потому что у каждого подпредставления, которое он содержит, может быть свой собственный текущий уровень масштабирования. Обратите внимание, что в UIScrollView нет поля для сохранения текущего уровня масштабирования. Однако мы знаем, что кто-то сохраняет этот уровень масштабирования, потому что, если вы сузите масштабирование подпредставления, затем сбросите его преобразование до CGAffineTransformIdentity, а затем снова нажмите, вы заметите, что предыдущий уровень масштабирования подпредставления был восстановлен.
Действительно, если вы посмотрите на дизассемблирование, это UIView сохраняет свой собственный уровень масштабирования (внутри объекта UIGestureInfo, на который указывает поле _gestureInfo). Он также имеет набор хороших недокументированных методов, таких как zoomScale
и setZoomScale:animated:
. (Имейте в виду, у него также есть куча методов, связанных с вращением, возможно, скоро мы получим поддержку жестов вращения.)
Однако, если мы создадим новый UIView только для масштабирования и добавим наш реальный масштабируемый вид в качестве его дочернего элемента, мы всегда начнем с уровня масштабирования 1,0. Моя реализация программного масштабирования основана на этом приеме.