Я использую масштабирующий 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 решил, что он подпрыгивает.
Так что я немного растерялся. Кто-нибудь еще пробовал сделать что-то подобное?