objective-c - NSPopover 的 contentViewController 中的动画变化

标签 objective-c macos cocoa core-animation nspopover

我有一个NSPopover ,它在两个 View Controller 之间切换。

我在启动时设置了一个,

self.popover.contentViewController = viewController1;

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

self.popover.contentViewController = viewController2;

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

我正在使用图层支持的 View ,我在AppDelegate中设置如下的applicationDidFinishLaunching方法:

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

这是我尝试过的:

  • 淡出-viewWillDisappear中的第一个 View Controller 的 View 并在 -viewWillAppear 中的第二个 View Controller 的 View 中淡出。这会立即淡出第一个 VC 的 View ,并且不会淡出第二个 VC 的 View
  • 在切换弹出窗口的 contentViewController 之前淡出第一个 VC 的 View 层:

    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;
    

第二种策略在切换 View Controller 之前不会等待动画完成。

如何用动画更改 NSPopover 的 contentViewController

最佳答案

因此,由于父 View Controller 中有多个 subview Controller ,因此您应该遵循 View Controller 包含协议(protocol)。您不想对 View 进行动画处理,而是希望对 View Controller 本身之间的转换进行动画处理。

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。

几乎只是告诉旧的 View Controller 它正在从父级中删除,动画转换,然后删除旧的 Controller 并让新的 Controller 知道它已被移动到父级。

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

还有关于自定义过渡的好教程:http://www.objc.io/issues/12-animations/custom-container-view-controller-transitions/

关于objective-c - NSPopover 的 contentViewController 中的动画变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31295001/

相关文章:

objective-c - 将字节顺序交换为 double 值

iphone - 在存储在 Sqlite 中的 UIWebview 中打开 NSData(PDF 内容)

c - 如何在 OSX 上的 C 程序中处理(推测的)UTF-8 字符串

swift - 如何观察 OS X 中的其他应用程序图标?

python - Mac OS Lion 上的 cx_Oracle

objective-c - CoreText 相当于 [NSFont fontWithName]

swift - 如何处理 Process.run 抛出的异常

objective-c - 关于删除对象索引

iphone - 如何获取 UI 按钮 iPhone 的 X 和 Y 位置

iphone - 子对象初始化为父对象