1

我在我的应用程序中多次使用此标准代码将 VC 推送到导航。控制器。

 [self.navigationController pushViewController:detailController animated:YES];

但有时他们会停止工作——视图控制器被正确推送但没有动画(就像我会使用“动画:否”一样),我不知道为什么。

有什么建议可以观察或尝试吗?

4

1 回答 1

0

每当您使用 ...animated:YES/NO 时,Cocoa 框架将确定它是否可以/不能这样做,而且通常它只是失败了。就像迈克尔说的那样,你可能不在主线程上,也不知道是什么。如果您在 NSWindow 上查看用于全屏动画的最新 Lion API,您会发现动画失败的各种委托无法提供详细信息。所以我不指望苹果会回归动画师并添加这样的功能。

要回答您的问题,主要是我会使用我自己的使用 Core Animations 的自定义动画。他们真的没有那么糟糕。为了让您开始,您可以创建一个类别或类方法为方便起见,如下所示:

+ (void) animateWithDuration:(NSTimeInterval)duration 
                   animation:(void(^)())animationBlock
                  completion:(void(^)())completionBlock {

    [NSAnimationContext runAnimationGroup:^( NSAnimationContext *context ) {

        if ( duration > 0 ) [context setDuration:duration];
        [context setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault]];

        if ( animationBlock ) animationBlock();

    } completionHandler:^ {

        if ( completionBlock ) completionBlock();

    }];
}

然后,您可以像这样将它用于多个动画。像这样...

[AnimationContext animateWithDuration:myDuration animation:^{

        // You can use whatever animation you want here or even nest
        CABasicAnimation *fade  = /* opacity animation */; 
        [view.layer addAnimation:fade forKey:nil];

    } completion:^{ 

        // Do some completion here.
}];

请注意,您可以通过这种方式更好地控制动画。

希望这能回答您正在寻找的内容。

(注意,我的示例是针对 Mac OS X。在 iOS 上,相当于 NSAnimationContext 是使用 CATransaction 进行包装)

于 2012-04-13T17:04:40.230 回答