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