缩放弹跳时,UIScrollView的zoomScale属性不会更新

现在我有一个在UIScrollView之外的视图。 出于很多原因,它不能简单的在scrollview里面。 所以现在我所做的是,当UIScrollView缩放/平移,我更新我的其他辅助视图。 我要进入的唯一问题是,当视图反弹到最小或最大比例时,zoomScale值不进行调整。 任何build议如何获得这个价值,而它的animation回来?

示例代码:

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; 

然后自我

 -(void) scrollViewDidZoom:(UIScrollView *)scrollView { float scale = [scrollView zoomScale]; [self updateAuxViewScale:scale]; } 

感谢这个答案,很明显,可以使用presentationLayer来获取正确的值。 我创build了一个UIScrollView category ,为zoomScalecontentOffsetcontentSize添加特殊的getter,即使UIScrollViewanimation,它也会返回正确的值。

你可以在这里find回购: https : //github.com/bddckr/BDDRScrollViewExtensions

缩放的反弹是一个animation,所以即使animation仍在运行,属性zoomScale也立即成为animation的目标值。 如果您想将滚动视图的缩放比例应用到另一个视图,可以使用下面的方法来获取它:

  1. -scrollViewDidScroll:检查内容视图是否有animation。
  2. 如果没有animation,只设置新的缩放比例。
  3. 如果有animation,请获取其中一个的持续时间(持续时间应该都是相等的),然后使用该持续时间将您的视图animation到新的缩放比例。

这种方法不是优雅的,但它的工作原理。 下面是一些让你开始的代码:

 - (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]; } } 

你应该使用不同的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

“任何”反弹“animation之后,滚动视图也会调用这个方法。”

好吧,我想我可能find了可以帮助你的东西。 在这个相关的线程在iOS 4.0中,为什么UIScrollView zoomToRect:animation:在animation时不触发scrollViewDidScroll或scrollViewDidZoom委托? ,有两个答案可能对你有用。

  1. https://stackoverflow.com/a/15512253/1011213
  2. https://stackoverflow.com/a/7553969/1011213

我个人认为,我会给第一个解决scheme一个镜头。 希望我明白这个问题,这是有帮助的。 如果不是..道歉和最幸福的编码!

据我所知,如果你想知道当前缩放级别,你应该使用下面的委托方法UIScrollView

 - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale { NSLog(@"Zoomscale %f",scale); } 

希望这对你有用。

享受编程!