UIView. Как ограничить масштабирование только одним измерением - PullRequest
4 голосов
/ 14 сентября 2009

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

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

Ура, Дуг

Ответы [ 3 ]

15 голосов
/ 15 сентября 2009

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

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

- (void)setTransform:(CGAffineTransform)newValue;
{
 CGAffineTransform constrainedTransform = CGAffineTransformIdentity;
 constrainedTransform.a = newValue.a;
 [super setTransform:constrainedTransform];
}
1 голос
/ 01 января 2012

В scrollViewDidZoom: , отрегулируйте переменные представления содержимого на основе zoomScale , сбросьте zoomScale до 1,0, затем выполните setNeedsDisplay на просмотр содержимого Обработайте фактический масштаб (в любом направлении) в представлении содержимого drawRect: .

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

  1. Во время масштабирования UIScollView изменяет contentOffset и contentScale , поэтому сохраните эти предыдущие значения в scrollViewWillBeginZooming: и scrollViewDidZoom: , чтобы вы могли самостоятельно вычислить новый contentOffset в соответствии с масштабом.

  2. Поскольку изменение zoomScale немедленно вызовет еще один scrollViewDidZoom: , необходимо установить BOOL до (и очистить после) сброса zoomScale . Проверьте BOOL в начале scrollViewDidZoom: и верните, если оно истинно.

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

1 голос
/ 14 сентября 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...