Dav*_*vid 28 uiscrollview uiscrollviewdelegate ios4 ios
我需要密切监视滚动视图的比例,以便我可以根据滚动视图的动画缩放更新内容视图的元素(管理多个CALayers的子视图).
在iOS 3.1上,一切都按预期工作,我使用zoomToRect:animated:并且在动画发生时重复调用UIScrollViewDelegate的scrollViewDidScroll:消息,让我根据实际缩放更新子视图元素.
iOS 4.0上的相同代码不会表现出相同的行为.当我调用zoomToRect:animated:时,委托(scrollViewDidScroll:和scrollViewDidZoom)只被调用一次,这使得我的子元素被同步,直到动画结束.实际上,子元素会立即跳转然后被缩放动画捕捉到所有内容都在正确的位置.就像动画没有在子视图CALayers上获取修改一样.
我已尝试使用动画块手动动画,但情况相同,没有渐进式回调调用.我也尝试过KVO,但我不清楚如何使用UIScrollView管理的动画.
在iOS 4上是否有一种解决方法可以让我将比例值推送到我的子视图,因为UIScrollView比例是动画的?
野蛮但有效.
定义一些属性:
@property (nonatomic, strong) UIView *zoomedView;
@property (nonatomic, strong) CADisplayLink *displayLink;
@property (nonatomic) CGFloat currentScale;
Run Code Online (Sandbox Code Playgroud)
通知UIScrollView其UIView将被放大:
- (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)
| 归档时间: |
|
| 查看次数: |
4602 次 |
| 最近记录: |