是否可以在 UINavigationController 前面显示相机视图

Posted

技术标签:

【中文标题】是否可以在 UINavigationController 前面显示相机视图【英文标题】:Is it possible to present a camera view in front of a UINavigationController 【发布时间】:2018-02-27 00:17:06 【问题描述】:

ios 10.3.1

我有一张地图,它是相当深的视图层次结构的一部分,地图上有一些按钮,用于向包裹在导航控制器中的用户呈现额外的全屏“详细信息”视图。

所以用户在地图上点击一个按钮,触发下面的“displayFormForIdentifier:navigWindowTitle:”方法。

“详细信息”视图被推送到导航控制器并显示给用户。此“详细信息”视图上有一个相机按钮。 当用户点击相机按钮时,我试图在 UINavigationController 顶部显示相机,以便用户可以拍照。

问题是当用户点击相机按钮时,什么都没有发生,我假设导航控制器遮挡了相机视图。

我认为我没有看到相机视图的原因是因为我试图在根据此检查在我的视图层次结构中似乎不存在的视图上呈现相机视图...po [[[[UIApplication sharedApplication] windows] firstObject] recursiveDescription]

所以 2 个问题...

(1.) 在我展示导航控制器之后,我的导航控制器及其子视图似乎是我的视图层次结构的全部。我在我的 AppDelegate 类中。我的 AppDelegate 具有试图呈现相机视图的代码。我可以从我的 AppDelegate 中获取对此导航控制器的引用吗?

(2.) 我可以使用这个导航控制器来呈现相机视图吗?还是我需要以其他方式执行此操作?

-(void)displayFormForIdentifier:(NSInteger)identifier navigWindowTitle:(NSString *)title

    UIViewController *viewWithCameraButton = [MyViewControllers getViewControllerWithIdentifier:identifier];
    viewWithCameraButton.edgesForExtendedLayout = UIRectEdgeNone;
    viewWithCameraButton.navigationItem.title = title;
    viewWithCameraButton.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(formDone)];

    theNavigationController = [[UINavigationController alloc] init];
    theNavigationController.navigationBar.translucent = NO;
    [theNavigationController pushViewController:viewWithCameraButton animated:YES];

    [mapViewController presentViewController:theNavigationController animated:YES completion:^];

下面显示了这个问题的另一种观点。

请注意,我有两个相互竞争的视图层次结构...一个由 rootViewController 持有,一个显然由 UIWindow 和导航控制器持有。

我正在尝试从我的 rootViewController 显示相机,但是当 UINavigationController 处于活动状态时,该视图层次结构不活动,并且我不知道如何在 UINavigationController 前面显示相机视图。

(lldb) po [[[UIApplication sharedApplication] windows] firstObject]
<UIWindow: 0x15592120; frame = (0 0; 768 1024); gestureRecognizers = <NSArray: 0x15592b80>; layer = <UIWindowLayer: 0x155923b0>>

(lldb) po [[[[UIApplication sharedApplication] windows] firstObject] recursiveDescription]
<UIWindow: 0x15592120; frame = (0 0; 768 1024); gestureRecognizers = <NSArray: 0x15592b80>; layer = <UIWindowLayer: 0x155923b0>>
   | <UITransitionView: 0x1840d0e0; frame = (0 0; 768 1024); autoresize = W+H; layer = <CALayer: 0x1732a4d0>>
   |    | <UILayoutContainerView: 0x1749a730; frame = (0 0; 768 1024); autoresize = W+H; gestureRecognizers = <NSArray: 0x16ec4900>; layer = <CALayer: 0x18509620>>
   |    |    | <UINavigationTransitionView: 0x17498d40; frame = (0 0; 768 1024); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x16e731b0>>
   |    |    |    | <UIViewControllerWrapperView: 0x185a5820; frame = (0 0; 768 1024); autoresize = RM+BM; layer = <CALayer: 0x16ae0f40>>
   |    |    |    |    | <UIView: 0x173f83c0; frame = (0 64; 768 960); autoresize = RM+BM; tag = 500; layer = <CALayer: 0x171775c0>>
   |    |    |    |    |    | <UIView: 0x16fda3b0; frame = (0 0; 768 35); autoresize = RM+BM; tag = 502; layer = <CALayer: 0x1681afa0>>





(lldb) po [[[[UIApplication sharedApplication] delegate] window] rootViewController];
<TabBarController: 0x15642ed0>

(lldb) po [((UIViewController*)0x15642ed0).view recursiveDescription]
<UIView: 0x1564d8d0; frame = (0 20; 768 1004); autoresize = W+H; tag = 23456; layer = <CALayer: 0x1564d9b0>>
   | <IGSlideTabView: 0x15643420; frame = (0 0; 768 1004); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x15591940>>
   |    | <UIView: 0x15591c10; frame = (0 0; 768 969); autoresize = LM+W+RM+TM+H+BM; layer = <CALayer: 0x15591e00>>
   |    |    | <UIView: 0x1564d740; frame = (0 0; 768 1004); clipsToBounds = YES; autoresize = RM+BM; tag = 2345; layer = <CALayer: 0x1564d820>>
   |    |    |    | <UIView: 0x16974f10; frame = (0 0; 768 1004); autoresize = W+RM+H+BM; tag = 1111; layer = <CALayer: 0x1696baa0>>
   |    |    |    |    | <UIView: 0x1698cc10; frame = (0 0; 768 44); autoresize = RM+BM; tag = 1010; layer = <CALayer: 0x1698f6d0>>
   |    |    |    |    |    | <UIToolbar: 0x16b40320; frame = (0 0; 768 44); opaque = NO; autoresize = W+BM; tag = 2000; layer = <CALayer: 0x1687db00>>

【问题讨论】:

【参考方案1】:

而不是推动cameraVC使用这个

[[UINavigationController alloc] initWithRootViewController:viewWithCameraButton]

【讨论】:

以上是关于是否可以在 UINavigationController 前面显示相机视图的主要内容,如果未能解决你的问题,请参考以下文章

在 UINavigationController 中设置自定义导航栏类

在 Swift 2.0 中设置 UINavigationController 栏标题

UITabBarNavigationController 中的 UINavigationController 不加载表数据

用动画隐藏导航控制器和标签栏控制器

UINavigationController -> UIViewController -> UIView -> UITableViewController?

功能差异,UINavigationController vs Only Storyboard Segue