Как я могу отменить отскок масштабирования UIScrollView?

Я использую масштабирующий 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 имеет значение false.
  • Добавление метода -touchesEnded: withEvent . Он никогда не вызывается.
  • Добавление моего собственного UIPinchGestureRecognizer для одновременного выполнения с собственным распознавателем щипков UIScrollView. Не работает, потому что его обработчики (и методы делегата) вызываются после щипкового жеста UIScrollView, который принимает решение отскочить до того, как мой жест может сказать это тоже. Я попытался удалить все основные жесты, добавить свои и снова добавить основные жесты. Но мой жест все еще был вызван после того, как UIScrollView решил, что он отскакивает.

Так что я немного растерялся. Кто-нибудь еще пытался сделать что-то подобное?

5
задан theory 7 March 2011 в 06:13
поделиться