Пользовательский просмотр.Как мне ограничить масштабирование только одним измерением

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

  •  07-07-2019
  •  | 
  •  

Вопрос

У меня есть экземпляр UIScrollView, содержащий экземпляр UIView.UIView - это просто контейнер для горизонтального массива экземпляров UIImageView.- Масштабирование обеспечивается UIScrollView и UIScrollViewDelegate.Я хотел бы ограничить масштабирование, чтобы оно происходило только вдоль горизонтальной оси без какого-либо вертикального масштабирования вообще.Как мне это сделать?

Есть ли способ, например, создать подкласс UIView и переопределить соответствующий метод, чтобы предотвратить вертикальное масштабирование?Мне нравится этот подход, но мне неясно, какой метод переопределять и что на самом деле должен делать этот переопределенный метод.

Приветствия, Даг

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

Решение

Похоже на то, что я описываю в этот ответ, вы можете создать подкласс UIView и переопределить -setTransform:метод доступа для настройки преобразования, которое UIScrollView попытается применить к вашему UIView.Установите этот UIView для размещения ваших вложенных представлений контента и сделайте его вложенным представлением UIScrollView.

В вашем переопределенном setTransform: вам нужно будет принять преобразование, которое UIScrollView хотел бы применить, и настроить его так, чтобы масштабирование действовало только в одном направлении.Из документация о том, как создаются матрицы CGAffineTransform, Я считаю , что следующая реализация должна ограничить ваше масштабирование только горизонтальным направлением:

- (void)setTransform:(CGAffineTransform)newValue;
{
 CGAffineTransform constrainedTransform = CGAffineTransformIdentity;
 constrainedTransform.a = newValue.a;
 [super setTransform:constrainedTransform];
}

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

Используя OS 3.0, вы можете указать масштабирование, чтобы увеличить прямоугольник в scrollview.У меня есть это в моей логике, которая обнаруживает нажатия.

CGRect zoomRect = [self zoomRectForScale:newScale withCenter:CGPointMake(tapPoint.x, tapPoint.y) inScrollView:scrollView];
[scrollView zoomToRect:zoomRect animated:YES];

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

В scrollViewDidZoom ( Прокрутка ):, измените переменные вашего представления контента на основе Масштабирование, сброс Масштабирование до 1.0, затем выполните Настройка необходимости отображения в представлении содержимого.Управляйте фактическим масштабированием (в любом желаемом направлении) в вашем представлении контента. Нарисовать правильно:.

Уродливые Детали:

  1. Пока выполняется масштабирование, UIScollView изменяется Смещение содержимого и Масштаб контента, поэтому сохраните эти предыдущие значения в Просмотр прокрутки начнет увеличиваться: и в scrollViewDidZoom ( Прокрутка ): таким образом, вы можете вычислить новый Смещение содержимого себя в соответствии с увеличением.

  2. С тех пор как изменились Масштабирование немедленно уволит другого scrollViewDidZoom ( Прокрутка ):, вы должны установить BOOL до (и очистить после) сброса Масштабирование.Протестируйте BOOL в начале scrollViewDidZoom ( Прокрутка ): и верните, если true.

  3. Возможно, вам придется подавить scrollViewDidScroll Прокрутка: пока выполняется масштабирование (протестируйте BOOL;установите его в Просмотр прокрутки начнет увеличиваться: и очистите его в scrollViewDidEndZooming прокрутки:) таким образом, во время масштабирования используются ваши собственные значения contentOffsets.

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