在iOS 4.0中,为什么UIScrollView zoomToRect:animated:在动画时不触发scrollViewDidScroll或scrollViewDidZoom代理?

Dav*_*vid 28 uiscrollview uiscrollviewdelegate ios4 ios

我需要密切监视滚动视图的比例,以便我可以根据滚动视图的动画缩放更新内容视图的元素(管理多个CALayers的子视图).

在iOS 3.1上,一切都按预期工作,我使用zoomToRect:animated:并且在动画发生时重复调用UIScrollViewDelegatescrollViewDidScroll:消息,让我根据实际缩放更新子视图元素.

iOS 4.0上的相同代码不会表现出相同的行为.当我调用zoomToRect:animated:时,委托(scrollViewDidScroll:scrollViewDidZoom)只被调用一次,这使得我的子元素被同步,直到动画结束.实际上,子元素会立即跳转然后被缩放动画捕捉到所有内容都在正确的位置.就像动画没有在子视图CALayers上获取修改一样.

我已尝试使用动画块手动动画,但情况相同,没有渐进式回调调用.我也尝试过KVO,但我不清楚如何使用UIScrollView管理的动画.

在iOS 4上是否有一种解决方法可以让我将比例值推送到我的子视图,因为UIScrollView比例是动画的?

Bar*_*ski 9

野蛮但有效.

定义一些属性:

@property (nonatomic, strong) UIView *zoomedView;    
@property (nonatomic, strong) CADisplayLink *displayLink;
@property (nonatomic) CGFloat currentScale;
Run Code Online (Sandbox Code Playgroud)

通知UIScrollViewUIView将被放大:

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
     return self.zoomedView;
}
Run Code Online (Sandbox Code Playgroud)

注册一个CADisplayLink刻度.它也会运行核心动画,所以它会以相同的间隔运行:

self.displayLink  = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkTick)];
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
Run Code Online (Sandbox Code Playgroud)

检查zoomedView的presentationLayer当前值.

- (void)displayLinkTick
{
    CALayer *zoomedLayer = self.zoomedView.layer.presentationLayer;
    CGFloat scale = zoomedLayer.transform.m11;

    if (scale != self.currentScale) {
         self.currentScale = scale; // update property

         // the scale has changed!
    }
}
Run Code Online (Sandbox Code Playgroud)


Pab*_*blo -1

更新动画块(或开始/提交动画)中的所有子视图是否可行?就像是:

[self zoomToRect:zoomRect animated:YES];
[UIView animateWithDuration:1.0
    animations:^ {
        // change your subviews
    }
];
Run Code Online (Sandbox Code Playgroud)