Свойство zoomScale UIScrollView не обновляется во время масштабирования
Сейчас у меня есть представление, которое находится за пределами UIScrollView. По многим причинам он не может быть просто внутри scrollview. Поэтому прямо сейчас, что я делаю, так как UIScrollView масштабируется/подкрашивается, я обновляю другое вспомогательное представление. Единственная проблема, с которой я вхожу, - это значение масштабирования не корректируется, пока представление возвращается к минимальной или максимальной шкале. Любые предложения о том, как получить это значение во время его оживления?
Пример кода:
self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, appSize.width, appSize.height)];
self.scrollView.contentSize = CGSizeMake(appSize.width * 2, appSize.height * 2);
self.scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
self.scrollView.delegate = self;
self.scrollView.bounces = YES;
self.scrollView.bouncesZoom = YES;
self.scrollView.alwaysBounceHorizontal = YES;
self.scrollView.alwaysBounceVertical = YES;
self.scrollView.showsHorizontalScrollIndicator = YES;
self.scrollView.showsVerticalScrollIndicator = YES;
self.scrollViewZoomView = [[UIView alloc] initWithFrame:CGRectMake(0, 0,
appSize.width * 2,
appSize.height * 2)];
[[self scrollView] addSubview:self.scrollViewZoomView];
float minZoomScale = 2.0f;
self.scrollView.minimumZoomScale = minZoomScale;
self.scrollView.maximumZoomScale = 1.0f;
self.scrollView.zoomScale = self.scrollView.minimumZoomScale;
а затем на self
-(void) scrollViewDidZoom:(UIScrollView *)scrollView {
float scale = [scrollView zoomScale];
[self updateAuxViewScale:scale];
}
Ответы
Ответ 1
Благодаря этому ответу становится ясно, что для получения правильных значений можно использовать presentationLayer
.
Я создал UIScrollView
category
для добавления специальных геттеров для zoomScale
, contentOffset
и contentSize
, которые возвращают правильные значения, даже если анимация UIScrollView
.
Здесь вы можете найти репо: https://github.com/bddckr/BDDRScrollViewExtensions
Ответ 2
Отскок назад зум - это анимация, поэтому свойство zoomScale
- это сразу целевое значение анимации, даже если анимация все еще работает. Если вы хотите применить тот же масштаб масштабирования, что вид прокрутки для другого представления, вот способ его получения:
- В
-scrollViewDidScroll:
проверьте, есть ли в представлении содержимого анимации.
- Если анимации нет, установите только новую шкалу масштабирования.
- Если есть анимация, выберите продолжительность одного из них (длительность должна быть одинаковой) и анимируйте ваше представление с этой продолжительностью до новой шкалы масштабирования.
Этот подход не изящный, но он работает. Вот вам какой-то код, чтобы вы начали:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGFloat zoomScale = _scrollView.zoomScale;
CALayer *layer = _contentView.layer;
NSArray *animationKeys = [layer animationKeys];
if (animationKeys.count == 0) {
// set zoomScale on target view
} else {
CFTimeInterval duration = 0.0;
for (NSString *animationKey in animationKeys) {
CAAnimation *animation = [layer animationForKey:animationKey];
duration = animation.duration;
break;
}
// easeInEaseOut is the default animation when the zoom bounces
[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
// set zoomScale on target view
} completion:nil];
}
}
Ответ 3
Вы должны использовать другой метод UIScrollViewDelegate.
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
// Your code here
float scale = [scrollView zoomScale];
[self updateAuxViewScale:scale];
}
Согласно документам: https://developer.apple.com/library/ios/#documentation/uikit/reference/uiscrollviewdelegate_protocol/Reference/UIScrollViewDelegate.html
"Прокрутка также вызывает этот метод после любой анимации" отказов ".
Ответ 4
Хорошо, я думаю, что, возможно, нашел что-то, что поможет вам. В этой связанной теме В iOS 4.0 почему UIScrollView zoomToRect: анимированный: не запускать делегаты scrollViewDidScroll или scrollViewDidZoom во время анимации? есть два ответа, которые могут быть полезны для вы.
Лично я думаю, что я дам первое решение. Надеюсь, я понимаю вопрос, и это полезно. Если нет.. извинения и блаженное кодирование!
Ответ 5
Как мне известно, если вы хотите узнать текущий уровень масштабирования, вы должны использовать следующий метод делегирования для UIScrollView
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
{
NSLog(@"Zoomscale %f",scale);
}
Надеюсь, это будет полезно для вас.
Наслаждайтесь программированием!