Как я могу отменить отскок от увеличения UIScrollView? - PullRequest
5 голосов
/ 07 марта 2011

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

Теперь я хотел бы узнать, когда пинч закончился с изображением, на 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 ]

7 голосов
/ 30 июля 2013

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

scrollView.bouncesZoom = NO;

4 голосов
/ 07 марта 2011

Я думаю, что написание этого вопроса помогло мне найти путь к поиску решения. И, к счастью, это довольно просто! Итак, первый шаг, в моем коде, который устанавливает 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% -ным порогом, оно не вернется ни к чему, потому что это уже будет минимальный размер, а затем просто вызовет новую анимацию, чтобы уменьшить ее.

Simple. Уф!

0 голосов
/ 25 июля 2012

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

...