In iOS 4.0, why does UIScrollView zoomToRect:animated: not trigger the scrollViewDidScroll or scrollViewDidZoom delegates while animating?(在 iOS 4.0 中,为什么 UIScrollView zoomToRect:animated: 在动画时不触发 scrollViewDidScroll 或 scrollViewDidZoom 委托?)
问题描述
我需要密切监视滚动视图的比例,以便我可以根据滚动视图的动画缩放来更新内容视图的元素(管理多个 CALayers 的子视图).
I need to closely monitor the scale of the scroll view so that I can update the content view's elements (a subview managing multiple CALayers) according to the scroll view's animated zoom.
在 iOS 3.1 上,一切正常,我使用 zoomToRect:animated: 和 UIScrollViewDelegate 的 scrollViewDidScroll: 消息 在动画发生时重复调用,让我根据实际缩放更新子视图元素.
On iOS 3.1, everything works as expected, I use zoomToRect:animated: and the scrollViewDidScroll: message of the UIScrollViewDelegate gets called repeatedly while the animation takes place, letting me update the subview elements according to actual zoom.
iOS 4.0 上的相同代码不会表现出相同的行为.当我调用 zoomToRect:animated: 时,代表(scrollViewDidScroll: 和 scrollViewDidZoom)只会被调用 once,这使我的子元素去同步,直到动画完成.实际上,子元素会立即跳跃,然后被缩放动画赶上,直到一切都在正确的位置.就好像动画没有拾取子视图CALayers 上的修改.
The same code on iOS 4.0 does not exibit the same behavior. When I call zoomToRect:animated:, the delegates (scrollViewDidScroll: and scrollViewDidZoom) only get called once, which makes my sub elements desinchronized until the animation is finished. In fact, the sub elements immediately jump and then get caught up by the zoom animation until everything is in the correct place. It's as if the animation is not picking up the modifications on the subviews CALayers.
我曾尝试使用动画块手动制作动画,但情况相同,没有渐进式回调调用.我也尝试过 KVO,但我不清楚如何利用 UIScrollView 管理的动画.
I have tried animating manually with animation blocks, but the situation is the same, no progressive callback calls. I have also tried KVO, but it is not clear to me how I would tap into a UIScrollView-managed animation.
iOS 4 上是否有一种解决方法可以让我在 UIScrollView 缩放动画时将缩放值推送到我的子视图?
Is there a workaround on iOS 4 that would allow me to push the scale value to my subviews as the UIScrollView scale is animated?
推荐答案
残酷但有效.
定义一些属性:
@property (nonatomic, strong) UIView *zoomedView;
@property (nonatomic, strong) CADisplayLink *displayLink;
@property (nonatomic) CGFloat currentScale;
通知 UIScrollView 哪个 UIView 将被缩放:
Inform UIScrollView which UIView is going to be zoomed:
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return self.zoomedView;
}
注册一个 CADisplayLink 滴答声.它也运行核心动画,所以它会以相同的间隔被踢:
Register for a CADisplayLink ticks. It runs Core Animation as well, so it will be kicked on same intervals:
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkTick)];
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
检查 zoomedView 的 presentationLayer 的当前值.
Check zoomedView's presentationLayer for current values.
- (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 4.0 中,为什么 UIScrollView zoomToRect:animated: 在动画时不触发 scrollViewDidScroll 或 scrollViewDidZoom 委托?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在 iOS 4.0 中,为什么 UIScrollView zoomToRect:animated:
基础教程推荐
- AdMob 广告未在模拟器中显示 2022-01-01
- Cocos2d iPhone 非矩形精灵触摸检测 2022-01-01
- navigator.geolocation.getCurrentPosition 在 Android 浏览器上 2022-01-01
- 如何从 logcat 中删除旧数据? 2022-01-01
- 通过重定向链接在 Google Play 中打开应用 2022-01-01
- iOS4 创建后台定时器 2022-01-01
- NSString intValue 不能用于检索电话号码 2022-01-01
- iPhone - 获取给定地点/时区的当前日期和时间并将其与同一地点的另一个日期/时间进行比较的正确方法 2022-01-01
- Android:getLastKnownLocation(LocationManager.NETWORK_PROVIDER 2022-01-01
- libGDX 从精灵或纹理中获取像素颜色 2022-01-01
