透明背景与模态UIViewController

时间:2010-04-05 13:34:54

标签: iphone uiview uiviewcontroller uinavigationcontroller modal-dialog

我有一个困境,我想向用户呈现一个半透明的视图。

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

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

我真的不想进入每次推动此视图时我都被迫在导航栏上启用/禁用控件的情况,所以我想知道,如果有人知道我可以使用的任何解决方案我推到UITableViewController上的视图实际上会“推过”导航栏吗?

5 个答案:

答案 0 :(得分:13)

好笑,我昨天也在做同样的事情。不幸的是,这似乎是不可能的。一旦模态视图控制器就位,前一个视图就会隐藏。 请参阅此previous question on the topic

您仍然可以使用您已设置的视图控制器和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添加一些动画也很容易 - 我只是懒得这么做。

答案 1 :(得分:11)

现在有一种方法可以使用iOS7自定义转换实现此目的:

MyController * controller = [MyController new];
[controller setTransitioningDelegate:self.transitionController];
controller.modalPresentationStyle = UIModalPresentationCustom;
[self controller animated:YES completion:nil];

要创建自定义转换,您需要两件事:

  • TransitionDelegate对象(实现 <UIViewControllerTransitionDelegate>
  • “AnimatedTransitioning”对象 (实施<UIViewControllerAnimatedTransitioning>

您可以在本教程中找到有关自定义转换的更多信息:http://www.doubleencore.com/2013/09/ios-7-custom-transitions/

答案 2 :(得分:0)

试试这个:

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

答案 3 :(得分:-2)

您是否尝试过循环模式视图控制器的子视图并为每个视图设置背景颜色以清除?这是一个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];
viewDidLoad中的

答案 4 :(得分:-2)

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

// 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不同,视图将是全屏的。