Как мне выполнить сброс настроек (т. е.отменить масштабирование) UIScrollView?

StackOverflow https://stackoverflow.com/questions/611865

Вопрос

У меня есть UIScrollView, который содержит изображение и сегментированный элемент управления, который позволяет пользователю переключать изображение внутри ScrollView.Если я просто поменяю изображение местами внутри UIImageView, оно отобразит новое изображение в увеличенном виде.Как мне сбросить UIScrollView обратно в его не увеличенное состояние?

Это было полезно?

Решение

У меня есть подробное обсуждение того, как (и почему) работает масштабирование UIScrollView на github.com/andreyvit/ScrollingMadness/.

(Ссылка также содержит описание того, как программно увеличивать UIScrollView, как эмулировать подкачку в стиле библиотеки фотографий + масштабирование + прокрутка, пример проекта и класс ZoomScrollView, который инкапсулирует некоторые магические эффекты масштабирования.)

Цитата:

UIScrollView не имеет понятия “текущий уровень масштабирования”, поскольку каждое содержащееся в нем вложенное представление может иметь свой собственный текущий уровень масштабирования.Обратите внимание, что в UIScrollView нет поля для сохранения текущего уровня масштабирования.Однако мы знаем, что кто-то сохраняет этот уровень масштабирования, потому что, если вы увеличите масштаб подвида, затем сбросите его преобразование в CGAffineTransformIdentity, а затем снова увеличите, вы заметите, что предыдущий уровень масштабирования подвида был восстановлен.

Действительно, если вы посмотрите на дизассемблирование, именно UIView сохраняет свой собственный уровень масштабирования (внутри объекта UIGestureInfo, на который указывает поле _gestureInfo ).Он также имеет набор приятных недокументированных методов, таких как zoomScale и setZoomScale:animated:.(Имейте в виду, в нем также есть куча методов, связанных с вращением, возможно, когда-нибудь мы получим поддержку жестов вращения.)

Однако, если мы создадим новый UIView только для масштабирования и добавим наш реальный масштабируемый вид в качестве его дочернего элемента, мы всегда будем начинать с уровня масштабирования 1.0.Моя реализация программного масштабирования основана на этом трюке.

Другие советы

Если вы не перерисовываете свой вид по завершении события масштабирования, то коэффициент масштабирования устанавливается свойством transform вида, который вы возвращаете из метода viewForZoomingInScrollView: делегат. Чтобы сбросить это масштабирование, установите значение свойства transform представления в CGAffineTransformIdentity.

Однако остерегайтесь того, что ваша следующая операция масштабирования будет начата с того места, где предыдущий масштаб был отменен (то есть ваш новый масштаб будет игнорироваться). Чтобы обойти это, вам может понадобиться реализовать некоторые из описанных мной .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top