我正在尝试将慢动作效果应用到我的应用程序,就像你按下Shift键如何减慢Mac OS的大多数图形效果一样.
我的应用程序使用CoreAnimation,所以我认为它应该没什么大不了的:设置speed为一些较慢的值(比如0.1)并将其设置回1一旦我完成,然后我就去了.
不幸的是,这似乎不是正确的方法.减速效果很好,但是当我想恢复到正常速度时,它会恢复速度,就像速度1一样.这基本上意味着如果我按住Shift足够长的时间,只要我释放它,动画就会立即完成.
我找到了一个技术质量保证页面,解释了如何暂停和恢复动画,但如果它不是完全暂停动画,我似乎无法做到正确.我在时间扭曲方面肯定不是很擅长.
什么是减速然后使用CoreAnimation恢复动画的正确方法?
这是有用的代码:
-(void)flagsChanged:(NSEvent *)theEvent
{
CALayer* layer = self.layer;
[CATransaction begin];
CATransaction.disableActions = YES;
layer.speed = (theEvent.modifierFlags & NSShiftKeyMask) ? 0.1 : 1;
[CATransaction commit];
}
Run Code Online (Sandbox Code Playgroud)
棘手的问题...
我使用基本的 UIView 设置了测试。我启动其图层从当前点到目标点的动画。
为了减慢核心动画的速度,我实际上必须构建并替换一个新的动画(因为您无法修改现有的动画)。
弄清楚当前动画已经进行了多远尤为重要。这是通过访问 beginTime、currentTime、计算经过的时间,然后计算出新动画的持续时间应该是多长来完成的。
- (void)initiate {
if(!initiated) {
[CATransaction begin];
[CATransaction disableActions];
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut]];
CABasicAnimation *ba = [CABasicAnimation animationWithKeyPath:@"position"];
ba.duration = 10.0f;
ba.fromValue = [NSValue valueWithCGPoint:view.layer.position];
ba.toValue = [NSValue valueWithCGPoint:CGPointMake(384, 512)];
[view.layer addAnimation:ba forKey:@"animatePosition"];
[CATransaction commit];
initiated = YES;
}
}
- (void)slow {
[CATransaction begin];
CABasicAnimation *old = (CABasicAnimation *)[view.layer animationForKey:@"animatePosition"];
CABasicAnimation *ba = [CABasicAnimation animationWithKeyPath:@"position"];
CFTimeInterval animationBegin = old.beginTime;
CFTimeInterval currentTime = CACurrentMediaTime();
CFTimeInterval elapsed = currentTime - animationBegin;
ba.duration = [[old valueForKey:@"duration"] floatValue] - elapsed;
ba.duration = [[old valueForKey:@"duration"] floatValue];
ba.autoreverses = [[old valueForKey:@"autoreverses"] boolValue];
ba.repeatCount = [[old valueForKey:@"repeatCount"] floatValue];
ba.fromValue = [NSValue valueWithCGPoint:((CALayer *)[view.layer presentationLayer]).position];
ba.toValue = [old valueForKey:@"toValue"];
ba.speed = 0.1;
[view.layer addAnimation:ba forKey:@"animatePosition"];
[CATransaction commit];
}
- (void)normal {
[CATransaction begin];
CABasicAnimation *old = (CABasicAnimation *)[view.layer animationForKey:@"animatePosition"];
CABasicAnimation *ba = [CABasicAnimation animationWithKeyPath:@"position"];
CFTimeInterval animationBegin = old.beginTime;
CFTimeInterval currentTime = CACurrentMediaTime();
CFTimeInterval elapsed = currentTime - animationBegin;
ba.duration = [[old valueForKey:@"duration"] floatValue] - elapsed;
ba.autoreverses = [[old valueForKey:@"autoreverses"] boolValue];
ba.repeatCount = [[old valueForKey:@"repeatCount"] floatValue];
ba.fromValue = [NSValue valueWithCGPoint:((CALayer *)[view.layer presentationLayer]).position];
ba.toValue = [old valueForKey:@"toValue"];
ba.speed = 1;
[view.layer addAnimation:ba forKey:@"animatePosition"];
[CATransaction commit];
}
Run Code Online (Sandbox Code Playgroud)
注意:上面的代码仅适用于 1 个方向,不适用于自动反转的动画...
| 归档时间: |
|
| 查看次数: |
1749 次 |
| 最近记录: |