gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:48:34 24 4
gpt4 key购买 nike

我有一个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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com