代码之家  ›  专栏  ›  技术社区  ›  Mick Walker

带模式uiviewcontroller的透明背景

  •  20
  • Mick Walker  · 技术社区  · 15 年前

    我有一个dilema,我想给用户呈现一个半透明的视图。

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

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

    我真的不想陷入这样一种情况:每次我推这个视图时,我都被迫启用/禁用导航栏上的控件,所以我想知道,是否有人知道我可以使用的任何解决方案,以便我推到uitableviewcontroller上的视图将实际“推过”导航酒吧?

    6 回复  |  直到 9 年前
        1
  •  13
  •   Community CDub    8 年前

    好笑,我昨天也在做同样的事。不幸的是,这似乎是不可能的。一旦模态视图控制器就位,上一个视图将隐藏。 看到这个 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 -隐藏 如果你想让它从屏幕底部向上动画-我就是懒得这么做。

        2
  •  13
  •   Douglas Hill    9 年前

    iOS8增加了 UIModalPresentationOverFullScreen presentation style . 将其设置为显示的视图控制器 modalPresentationStyle . 对于更高级的需求,请考虑创建一个自定义 presentation controller .

        3
  •  11
  •   Alexis C.    11 年前

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

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

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

    • transitionedelegate对象(实现 <UIViewControllerTransitionDelegate> )
    • “animatedTransitioning”对象 (实施 <UIViewControllerAnimatedTransitioning> )

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

        4
  •  0
  •   Hsm    9 年前

    试试这个:

    ViewController *vc = [[ViewController alloc] init];
    [vc setModalPresentationStyle:UIModalPresentationOverCurrentContext];
    [self presentViewController:vc animated:YES completion:nil];
    
        5
  •  -2
  •   coneybeare    15 年前

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

        6
  •  -2
  •   Navn    12 年前

    这就行了..试试这个。

    // 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。