在NSPopover的contentViewController中动画更改

时间:2015-07-08 14:00:23

标签: objective-c macos cocoa core-animation nspopover

我有一个NSPopover,它在两个视图控制器之间切换。

我在发布时设置了一个,

self.popover.contentViewController = viewController1;

我根据用户操作更改为另一个:

self.popover.contentViewController = viewController2;

AppKit为NSPopover本身做了一些动画来容纳第二个VC,它运行良好,但两个View Controller的视图之间的转换是不和谐的。我希望它们能够水平滑入或滑出,或者至少交叉淡入淡出。

我正在使用图层支持的视图,我在AppDelegate的{​​{1}}方法中设置了这样的视图:

applicationDidFinishLaunching

这是我尝试过的:

  • 淡出self.popover.contentViewController.view.wantsLayer = YES; self.popover.contentViewController.view.layerContentsRedrawPolicy = NSViewLayerContentsRedrawOnSetNeedsDisplay; 中的第一个视图控制器视图,淡出-viewWillDisappear中的第二个视图控制器视图。这会立即淡出第一个VC的视图,并且不会使
  • 中的第二个VC视图淡出
  • 在切换popover -viewWillAppear之前淡出第一个VC的视图层:

    contentViewController

在切换视图控制器之前,第二个策略不会等待动画完成。

如何动画更改NSPopover的CALayer *theLayer = self.popover.contentViewController.view.layer; CABasicAnimation* fadeAnim = [CABasicAnimation animationWithKeyPath:@"opacity"]; fadeAnim.fromValue = [NSNumber numberWithFloat:1.0]; fadeAnim.toValue = [NSNumber numberWithFloat:0.0]; fadeAnim.duration = 1.0; [theLayer addAnimation:fadeAnim forKey:@"opacity"]; theLayer.opacity = 0.0; self.popover.contentViewController = self.viewController;

1 个答案:

答案 0 :(得分:-1)

因此,由于父视图控制器中有多个子视图控制器,因此应遵循视图控制器包含协议。而不是动画您想要为视图控制器本身之间的过渡设置动画的动画。

toController.view.frame = fromController.view.bounds;                           
[containerViewController addChildViewController:toController];                                     
[fromController willMoveToParentViewController:nil];

[containerViewController transitionFromViewController:fromViewController
                                     toViewController:toViewController
                                             duration:0.2
                                              options:UIViewAnimationOptionTransitionCrossDissolve
                                           animations:nil
                                           completion:^(BOOL finished) {
                                               [fromViewController removeFromParentViewController];
                                               [toViewController didMoveToParentViewController:containerViewController];
                                               toViewController.view.frame = containerViewController.view.bounds;
                                           }];

其中containerViewController是你的contentViewController。

几乎只是告诉旧的视图控制器它将从父节点移除,为转换设置动画,并删除旧控制器并让新控制器知道它已被移动到父节点。

来自苹果的更多信息:https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

这里有关于自定义转换的精彩教程:http://www.objc.io/issues/12-animations/custom-container-view-controller-transitions/