我有一个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的视图,并且不会使在切换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;
?
答案 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。
几乎只是告诉旧的视图控制器它将从父节点移除,为转换设置动画,并删除旧控制器并让新控制器知道它已被移动到父节点。
这里有关于自定义转换的精彩教程:http://www.objc.io/issues/12-animations/custom-container-view-controller-transitions/