我有一个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 知道它已被移动到父级。
还有关于自定义过渡的好教程:http://www.objc.io/issues/12-animations/custom-container-view-controller-transitions/
关于objective-c - NSPopover 的 contentViewController 中的动画变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31295001/