gpt4 book ai didi

ios - 在 iOS 4.0 中,为什么 UIScrollView zoomToRect :animated: not trigger the scrollViewDidScroll or scrollViewDidZoom delegates while animating?

转载 作者:IT王子 更新时间:2023-10-29 07:51:54 26 4
gpt4 key购买 nike

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

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

iOS 4.0 上的相同代码不会表现出相同的行为。当我调用 zoomToRect:animated: 时,委托(delegate)(scrollViewDidScroll:scrollViewDidZoom)只被调用一次,这使我的子元素不同步,直到动画完成。事实上,子元素会立即跳跃,然后被缩放动画追上,直到一切都在正确的位置。就好像动画没有获取 subview CALayers 上的修改。

我试过用动画 block 手动设置动画,但情况是一样的,没有渐进式回调调用。我也尝试过 KVO,但我不清楚如何利用 UIScrollView 管理的动画。

在 iOS 4 上是否有一种解决方法可以让我在 UIScrollView 缩放动画时将缩放值推送到我的 subview ?

最佳答案

残酷但有效。

定义一些属性:

@property (nonatomic, strong) UIView *zoomedView;    
@property (nonatomic, strong) CADisplayLink *displayLink;
@property (nonatomic) CGFloat currentScale;

通知 UIScrollView 哪个 UIView 将被缩放:

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return self.zoomedView;
}

注册一个 CADisplayLink ticks。它也运行 Core Animation,所以它会以相同的间隔被踢:

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

检查 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!
}
}

关于ios - 在 iOS 4.0 中,为什么 UIScrollView zoomToRect :animated: not trigger the scrollViewDidScroll or scrollViewDidZoom delegates while animating?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3993532/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com