ios - CATransition 提前推送转换替换内容

标签 ios macos cocoa core-animation caanimation

我在 Mac 应用程序中有一个简单的动画设置,其中页面控件交换了一些 View 。我非常接近获得我想要的类似分页的动画,但是有一个小问题。分页工作正常,新页面动画正确到位,但新页面还替换了动画之前的初始页面。我希望最终被推出的 View 保持不变,而不是提前切换到新页面。 Here is a video showing the problem , 减慢到 3 秒的动画持续时间。这是代码:

UASourceView *previousSourceView = [self.sourceViewContainer.subviews objectAtIndex:0];
NSInteger previousIndex = [self.sourceViews indexOfObjectIdenticalTo:previousSourceView];

CATransition *pushTransition = [CATransition animation];
[pushTransition setType:kCATransitionPush];
[pushTransition setSubtype:(previousIndex < index) ? kCATransitionFromRight : kCATransitionFromLeft];
[pushTransition setDuration:PANEL_PAGE_SWIPE_ANIMATION_DURATION];
[pushTransition setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[pushTransition setRemovedOnCompletion:YES];

[CATransaction begin];
[self.sourceViewContainer replaceSubview:previousSourceView with:sourceView];
[CATransaction commit];

[sourceView.layer addAnimation:pushTransition forKey:@"push"];

有一个固定的容器 View self.sourceViewContainer 可以在每个动画上替换一个新的 subview 。如上所示,问题是 previousSourceView 立即被 sourceView 替换 并且 也被插入。请帮我停止立即更换。我哪里错了?

*注意,添加iOS标签是因为这段代码是平台无关的。

最佳答案

我使用 CAAnimationBlocks 解决了类似的问题(这是我对 original 的分支,作者已经朝着我不太关心的方向发展了)。

想法是将 removedOnCompletion 设置为 NO 并将 fillMode 设置为 kCAFillModeForwards 并执行实际的切换(没有动画)在完成 block 中。这仅在 OSX 下进行了测试(您可能需要针对 iOS 的不同解决方案,它已经支持完成 block )。

这是我的代码中的一个示例用法,它在棋盘上移动一个棋子,然后再返回:

CABasicAnimation *moveAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
moveAnimation.fromValue = [NSValue valueWithPoint:[self _pointForSquare:move.from()]];
moveAnimation.toValue = [NSValue valueWithPoint:[self _pointForSquare:move.to()]];
moveAnimation.duration = _animateSpeed / 1000.0;
moveAnimation.autoreverses = YES;
moveAnimation.removedOnCompletion = NO;
moveAnimation.fillMode = kCAFillModeForwards;
moveAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
moveAnimation.completion = ^(BOOL finished)
{
    [pieceLayer removeAnimationForKey:@"movePiece"];
    [self _setPieceLayer:pieceLayer toPiece:piece];
    [pieceLayer setNeedsDisplay];
};

[pieceLayer addAnimation:moveAnimation forKey:@"movePiece"];

关于ios - CATransition 提前推送转换替换内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13302072/

相关文章:

ios - 导航栏上的奇怪淡入淡出

ios - Firebase发送后端电子邮件或格式化数据以供审阅

javascript - 寻找一个可以下载 HTML 和所有资源的应用程序

swift - AppleScript 拦截通知

cocoa - 如何使用NSScanner扫描^[a-zA-Z_][a-zA-Z0-9_]*的格式

objective-c - Key value observing中的context参数是做什么用的

objective-c - NSString 是整数吗?

iphone - 如何在 iPhone 中获取设备位置名称?

ios - 应用程序传输安全 : Which method for RESTful APIs? `NSExceptionAllowsInsecureHTTPLoads` 或 `NSAllowsArbitraryLoads`

macos - Mac 上的 scons dylib 动态链接