Пользовательский просмотр.Как мне ограничить масштабирование только одним измерением
-
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, затем выполните Настройка необходимости отображения в представлении содержимого.Управляйте фактическим масштабированием (в любом желаемом направлении) в вашем представлении контента. Нарисовать правильно:.
Уродливые Детали:
Пока выполняется масштабирование, UIScollView изменяется Смещение содержимого и Масштаб контента, поэтому сохраните эти предыдущие значения в Просмотр прокрутки начнет увеличиваться: и в scrollViewDidZoom ( Прокрутка ): таким образом, вы можете вычислить новый Смещение содержимого себя в соответствии с увеличением.
С тех пор как изменились Масштабирование немедленно уволит другого scrollViewDidZoom ( Прокрутка ):, вы должны установить BOOL до (и очистить после) сброса Масштабирование.Протестируйте BOOL в начале scrollViewDidZoom ( Прокрутка ): и верните, если true.
Возможно, вам придется подавить scrollViewDidScroll Прокрутка: пока выполняется масштабирование (протестируйте BOOL;установите его в Просмотр прокрутки начнет увеличиваться: и очистите его в scrollViewDidEndZooming прокрутки:) таким образом, во время масштабирования используются ваши собственные значения contentOffsets.