Iphone 具有模态UIViewController的透明背景

Iphone 具有模态UIViewController的透明背景,iphone,uiview,uiviewcontroller,uinavigationcontroller,modal-dialog,Iphone,Uiview,Uiviewcontroller,Uinavigationcontroller,Modal Dialog,我有一个dilema,我想向用户展示一个半透明的视图 我通过实验发现,如果我只是将透明视图推到NavigationController堆栈的顶部,它将不会呈现我想要的透明度级别。因此,我决定简单地将视图添加为堆栈顶部当前视图的子视图 此解决方案有效,下面的视图仍然可见,并且视图为“半模态”。问题是,如果父视图继承自UITableViewController(就像我的一样),那么我“推”到它上面的视图不会覆盖顶部的导航栏 我真的不想每次按下这个视图时都被迫启用/禁用导航栏上的控件,所以我想知道,如

我有一个dilema,我想向用户展示一个半透明的视图

我通过实验发现,如果我只是将透明视图推到NavigationController堆栈的顶部,它将不会呈现我想要的透明度级别。因此,我决定简单地将视图添加为堆栈顶部当前视图的子视图

此解决方案有效,下面的视图仍然可见,并且视图为“半模态”。问题是,如果父视图继承自UITableViewController(就像我的一样),那么我“推”到它上面的视图不会覆盖顶部的导航栏


我真的不想每次按下这个视图时都被迫启用/禁用导航栏上的控件,所以我想知道,如果有人知道我可以使用任何解决方案,以便我推到UITableViewController上的视图实际上会“推”到导航栏上?

您是否尝试过在模态视图控制器的子视图上循环,并将每个视图的背景色设置为清除?这是一个DFS递归函数

- (void)setBackgroundToClearForView:(UIView *)view {
    if ([view subviews]) {
        for (UIView *subView in [view subviews]) {
            [self setBackgroundToClearForView:subView];
        }
    }

    if ([view respondsToSelector:@selector(setBackgroundColor:)]) {
        [view performSelector:@selector(setBackgroundColor:)
                   withObject:[UIColor clearColor]];
    }
}
要使用它,请致电:

[self setBackgroundToClearForView:self.view];

有趣的是,我昨天也在做同样的事情。不幸的是,这似乎是不可能的。模态视图控制器就位后,上一个视图将隐藏。 看这个

您仍然可以使用已设置的视图控制器和NIB文件—以下是我的示例代码

- (void)showUpgrade {
    [self.upgradeVC viewWillAppear:NO];
    [self.view addSubview:self.upgradeVC.view];
    [self.upgradeVC viewDidAppear:NO];
}

- (void)hideUpgrade {
    [self.upgradeVC viewWillDisappear:NO];
    [self.upgradeVC.view removeFromSuperview];
    [self.upgradeVC viewDidDisappear:NO];
}

- (UpgradeViewController *)upgradeVC {
    if (_upgradeVC == nil) {
        _upgradeVC = [[UpgradeViewController alloc] initWithNibName:[NSString stringWithFormat:@"UpgradeView_%@", self.deviceType] bundle:nil];
        _upgradeVC.delegate = self;
    }
    return _upgradeVC;
}
您需要在模态视图控制器中存储对父视图控制器的引用,以便访问
-hide
方法。我是通过一名代表做到这一点的


如果你想让它从屏幕底部向上动画化,那么在
-show
-hide
中添加一些动画也是很容易的-我只是太懒了,不想这么做。

这样就可以了。。试试这个

// for clear color or you can easily adjust the alpha here
 YourVC *vc=[[YourVC alloc]initWithNibName:@"YourVC" bundle:nil] ;
 vc.view.backgroundColor = [UIColor clearColor];
 self.modalPresentationStyle = UIModalPresentationCurrentContext;
 [self presentViewController:vc animated:NO completion:nil];

因此,与UIModalPresentationFormSheet不同,视图将是全屏的。

现在有一种方法可以使用iOS7自定义转换实现这一点:

MyController * controller = [MyController new];
[controller setTransitioningDelegate:self.transitionController];
controller.modalPresentationStyle = UIModalPresentationCustom;
[self controller animated:YES completion:nil];
要创建自定义转换,您需要两件事:

  • TransitionLegate对象(实现
  • “动画转换”对象 (实现
您可以在本教程中找到有关自定义转换的更多信息:

尝试以下方法:

ViewController *vc = [[ViewController alloc] init];
[vc setModalPresentationStyle:UIModalPresentationOverCurrentContext];
[self presentViewController:vc animated:YES completion:nil];

iOS 8添加了
UIModalPresentationOverFullScreen
。将其设置为显示的视图控制器的。对于更高级的需求,请考虑创建自定义视图。

我自己没有尝试过,但我的理解是父视图实际上已从视图堆栈中删除。请看:我认为苹果sdk不允许在iPhone上的UIViewController上使用透明bg。在这样做时,您如何处理设备的不同方向?在我看来,它总是会加载纵向视图,如果当前视图是横向视图,这是一个问题。这不是一个好的做法。看看这篇文章。它讨论了为什么将一个VC的视图作为子视图添加到另一个VC的视图是一个坏主意。是否可以拍摄下面(静态)视图的快照并作为背景应用?由于所述原因,这不起作用-在模式演示后删除背景视图。这应该是正确的答案,因为截至2015年10月24日,iOS 8+在iOS设备上的采用率>91%。