2011-03-07 2 views
5

Я использую масштабирование UIScrollView для отображения изображений в своем приложении для iPad. Масштабирование работает отлично, с щепоткой, делая изображение меньшим или большим, если необходимо. У меня также есть bouncesZoom, чтобы он отскакивал назад до минимального или максимального увеличения, если пользователь слишком сильно растягивает его так или иначе.Как я могу отменить масштабирование масштабирования UIScrollView?

Теперь я хотел бы узнать, когда пинч закончился с изображением на 10% меньше минимального размера зума и, в таком случае, предотвратить скачок и вызвать другую анимацию, которая сжимает изображение до " закрой его. Таким образом, может быть своего рода «щепотка, чтобы закрыть» жест. То, что я придумал, чтобы сделать это, в самом простом варианте, заключается в следующем:

- (void)scrollViewDidZoom:(UIScrollView *)scrollView { 
    if (self.zoomBouncing && zoomedToScale/self.minimumZoomScale < 0.90) { 
     // We've let go and were under 90% of the minimum size. 
     self.minimumZoomScale = zoomedToScale; 
     [self shrinkImageToNothing]; 
    } else { 
     // How far have we gone? 
     zoomedToScale = self.zoomScale; 
    } 
} 

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

Так что мой вопрос: как я могу предотвратить скачок только в этой конкретной ситуации? Не существует метода UIScrollViewDelegate, который позволяет моему коду что-то делать между тем, когда жест заканчивается, и когда UIScrollView решает вернуться назад. Я пробовал кучу других методов, не повезло, в том числе:

  • Возвращение nil из –viewForZoomingInScrollView:, когда был принят мой 90% порог увеличения. Не работает, потому что этот метод вызывается, когда начинается жест, а не для каждой точки масштабирования.
  • Установка bouncesZoom в -scrollViewDidZoom: на значение false, если коэффициент масштабирования меньше 90% и равен true, если он больше или равен 90%. Заставляет изображение дрожать плохо, когда масштаб становится меньше 90%, потому что он запрещает этот размер, когда bouncesZoom является ложным.
  • Добавление метода -touchesEnded:withEvent. Его никогда не называют.
  • Добавление моего собственного UIPinchGestureRecognizer для одновременной работы с собственным распознающим устройством UIScrollView. Не работает, потому что его обработчики (и методы делегирования) называются после Принудительный жест UIScrollView, который принимает решение отскочить, прежде чем мой жест может сказать это не так. Я попытался удалить все основные жесты, добавив мои и добавив основные жесты. Но мой жест был еще, вызванный после того, как UIScrollView решил, что он подпрыгивает.

Так что я нахожусь в убытке. Кто-нибудь еще пытался сделать что-то подобное?

ответ

3

Я предполагаю, что этот вопрос помог мне найти путь к поиску решения. И, к счастью, это довольно легко! Итак, первый шаг, в коде у меня есть то, что устанавливает minimumZoomScale, я также установил cachedMinZoomScale ivar на то же значение. При том, что, получив сильный удар не произойдет, когда масштаб меньше, чем 90% от минимума на самом деле довольно прямолинейно:

- (void)scrollViewDidZoom:(UIScrollView *)scrollView { 
    if (self.zoomScale/cachedMinZoomScale < 0.90) { 
     self.minimumZoomScale = self.zoomScale; 
    } else { 
     self.minimumZoomScale = cachedMinZoomScale; 
    } 
} 

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale { 
    if (self.zoomScale/cachedMinZoomScale < 0.90) { 
     [self shrinkImageToNothing]; 
    } 
} 

В основном, когда вид прокрутки изменяет масштаб изображения, сохранить -self.minimumZoomScale в текущем масштабе увеличения если он составляет менее 90% от фактического минимума, но установите его на этот фактический минимум при любой другой масштабной шкале. Затем, когда масштабирование закончится, если мы находимся под этим 90% -ным порогом, он не будет привязываться к чему-либо, потому что он уже будет минимальным размером, а затем просто вызовет новую анимацию для закрытия.

Простой. Уф!

+2

Что такое shrinkImageToNothing do and where is cachedMinZoomScale get set? – jjxtra

-2

Попробуйте это, [imageScrollview setBounces: NO];

+0

У меня это включено по другим причинам, как описано в вопросе. В принятом ответе речь идет о той необходимости, которую я имел. – theory

7

Вы должны просто установить это свойство как НЕТ. (например, ViewDidLoad)

scrollView.bouncesZoom = NO;

Смежные вопросы