【问题标题】:Animating Change in NSPopover’s contentViewControllerNSPopover 的 contentViewController 中的动画变化
【发布时间】:2015-09-26 12:01:53
【问题描述】:

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

我在发布时设置了一个,

self.popover.contentViewController = viewController1;

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

self.popover.contentViewController = viewController2;

AppKit 对NSPopover 本身做了一些动画以适应第二个 VC,效果很好,但是两个 View Controller 的视图之间的转换是不和谐的。我希望它们水平滑入和滑出,或者至少交叉淡入淡出。

我正在使用支持层的视图,我在 AppDelegateapplicationDidFinishLaunching 方法中设置如下:

self.popover.contentViewController.view.wantsLayer = YES;
self.popover.contentViewController.view.layerContentsRedrawPolicy = NSViewLayerContentsRedrawOnSetNeedsDisplay;

这是我尝试过的:

  • -viewWillDisappear 中淡出第一个视图控制器的视图并在-viewWillAppear 中淡出第二个视图控制器的视图。这会立即淡出第一个 VC 的视图,并且不会淡出第二个 VC 的视图
  • 在切换弹出框的contentViewController之前淡出第一个VC的视图层:

    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;
    

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

如何以动画方式更改 NSPopover 的 contentViewController

【问题讨论】:

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


    【解决方案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/

    【讨论】:

    • 谢谢,马克斯。这个问题是关于 Cocoa (Mac),而不是 Cocoa touch (iOS),所以虽然方法相似,但它们并不相同。我确实最终使用了与您建议的方法等效的方法。
    • 我还应该注意,我不能直接使用 NSPopover 的 contentViewController 执行此操作,我必须添加一个虚拟的空视图控制器作为我的两个 VC 的“父级”并分配 NSPopover 的 @ 987654325@ 到那个父视图控制器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2015-10-29
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    相关资源
    最近更新 更多