我有一个希望以标准方式呈现给用户的视图(从屏幕底部向上滑动)。这个视图的大约一半是透明背景,下半部分有一些输入字段(想象一下键盘弹出的方式)。当我调用[self presentViewController]
rootViewController 时,它会向上滑动视图,但大约半秒后,视图过去是透明的,它被替换为黑色。presentViewController 和 presentModalViewController 都会发生这种情况。如何改变这种行为?
5 回答
这是可能的, rockybalboa在 raywenderlich.com的论坛帖子中提供了解决此问题的方法:
iOS 8 UIModalPresentationCurrentContext 不透明?
该解决方案是在Objective-C中引用balboa的答案:
在 iOS 8 之前,您可以这样做:
[backgroundViewController setModalPresentationStyle:UIModalPresentationCurrentContext];
[backgroundViewController presentViewController:_myMoreAppsViewController animated:NO completion:nil];
在 iOS 8 中,您必须这样做:
backgroundViewController.providesPresentationContextTransitionStyle = YES;
backgroundController.definesPresentationContext = YES;
[overlayViewController setModalPresentationStyle:UIModalPresentationOverCurrentContext];
用等效的 Swift 补充上面的代码:
backgroundViewController.providesPresentationContextTransitionStyle = true
backgroundController.definesPresentationContext = true
overlayViewController.modalPresentationStyle = .OverCurrentContext
在带有 Swift 1.2 的 iOS 8.1 上使用 Xcode 6.3 beta 3 实现了这一点,它运行良好。
只是在查找和尝试 Ray Wenderlich 论坛解决方案之前,我查看了三个不同的 SO 问题(最近的现在标记为重复)的评论。
据我所知,当您呈现模型视图控制器时,不支持透明背景。尝试将控制器保留在您的根视图控制器中,并将子视图添加到根视图控制器。
最后,它看起来不可能是透明的,我通过将此视图添加为根视图控制器边界之外的子视图来解决这个问题,然后使用动画块将其滑动到位。没有太多额外的代码,但如果能够使用标准的 iOS 行为来做到这一点,那就太好了。
在使用
Disclaimer *vc = [[Disclaimer alloc]init];
为我解决问题的是在 IB 中创建一个相应的对象并使用它的故事板 ID 实例化视图控制器:
Disclaimer *vc = (Disclaimer *)[self.storyboard instantiateViewControllerWithIdentifier:@"SBIDDisclaimer"];
[self presentViewController:vc animated:YES completion:nil];
我猜想通过 IB 做一些额外的初始化。
使用 SWIFT 4,只需将此代码添加到您想要具有透明背景的视图控制器中。
override func viewDidLoad()
{
super.viewDidLoad()
self.modalPresentationStyle = .overFullScreen
self.view.backgroundColor = UIColor.clear
}