我想实现UIVisualEffectView
将模糊效果应用于视图以显示其背后的视图。
这个背景模糊的视图是嵌入在UITableViewController
中的UINavigationController
,它将在iPad上以popover显示,或者在iPhone上以模式全屏显示,感谢iOS 8自适应segues(现在作为Popover)。当这个视图控制器处于弹出框中时,我希望背景模糊弹出框下面的内容,当它全屏显示时,我希望背景模糊前一个视图控制器。
我试图实现这个并且没有成功。我甚至无法使模糊效果适用于弹出窗口。我认为这段代码可以解决问题:
//In viewDidLoad on the UITableViewController subclass:
let effectView = UIVisualEffectView(effect: UIBlurEffect(style: .Light))
effectView.frame = tableView.frame
tableView.addSubview(effectView)
我还尝试将子视图添加到tableView.backgroundView
,我尝试将backgroundView
设置为我的effectView
,我尝试使用Autolayout约束而不是设置框架,但没有任何效果。你能帮我完成所期望的行为吗?
我想要获得的一个例子:
iPad popover:
iPhone模态演示:
答案 0 :(得分:47)
我终于找到了解决方案。我不得不创建两个单独的segue - 一个用于仅在iPad上调用的Popover Presentation,另一个用于iPhone的演示风格设置为Over Full Screen(非常重要)的模式segue。
在正在显示的表格视图控制器中,在viewDidLoad
中,此代码将应用所需的模糊效果(和奖励,只有在它们没有禁用透明效果时):
if (!UIAccessibilityIsReduceTransparencyEnabled()) {
tableView.backgroundColor = UIColor.clear
let blurEffect = UIBlurEffect(style: .light)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
tableView.backgroundView = blurEffectView
//if inside a popover
if let popover = navigationController?.popoverPresentationController {
popover.backgroundColor = UIColor.clear
}
//if you want translucent vibrant table view separator lines
tableView.separatorEffect = UIVibrancyEffect(blurEffect: blurEffect)
}
这会导致表背景显示,就像在屏幕截图中一样。 iPhone的诀窍是确保它在屏幕上显示,而iPad的诀窍是删除backgroundColor
中的popoverPresentationController
。
答案 1 :(得分:6)
使用适应性添加模糊的快速示例:
extension ViewController: UIPopoverPresentationControllerDelegate {
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Grab the destination view controller and set the presentation delegate
let viewController = segue.destinationViewController as UIViewController
viewController.popoverPresentationController?.delegate = self
viewController.presentationController?.delegate = self
}
// Note: Only called for FormSheet and Popover
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
switch controller.presentedViewController {
case let vc as PopoverViewController:
return .None // Keep the popover in Compact screens
default:
return .OverFullScreen
}
}
func presentationController(controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {
// This is a custom method on UIViewController
controller.presentedViewController.createBlur()
// Wrap in a Navigation Controller, the controller should add a title and bar buttons
if !(presentedViewController is UINavigationController) {
return UINavigationController(rootViewController: presentedViewController)
}
}
}
extension UIViewController {
func createBlur(effectStyle: UIBlurEffectStyle = .Light) {
if !UIAccessibilityIsReduceTransparencyEnabled() {
view.backgroundColor = UIColor.clearColor()
let blurView = UIVisualEffectView(effect: UIBlurEffect(style: effectStyle))
blurView.autoresizingMask = UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleWidth
blurView.frame = view.bounds
view.insertSubview(blurView, atIndex: 0)
}
}
}
extension UITableViewController {
override func createBlur(effectStyle: UIBlurEffectStyle = defaultBlurEffectStyle) {
if !UIAccessibilityIsReduceTransparencyEnabled() {
tableView.backgroundColor = UIColor.clearColor()
let blurEffect = UIBlurEffect(style: effectStyle)
tableView.backgroundView = UIVisualEffectView(effect: blurEffect)
tableView.separatorEffect = UIVibrancyEffect(forBlurEffect: blurEffect)
}
}
}
答案 2 :(得分:5)
使用这一个稍微迟到了,但对我来说(在ios8 +中)最好的解决方案是在Storyboard中使用UIVisualEffectView并使其成为我的ViewController的根视图。然后将我的tableview添加到
要查找视觉效果视图,请转到右下角的组件选择器(不确定所谓的内容)并搜索VisualEffectView
这似乎是一种更容易实现的方式,并且符合Apple的建议,尽可能多地在故事板上进行操作
答案 3 :(得分:0)
IOS 10 Swift 3的一个小改动
if #available(iOS 10.0, *) {
let blurEffect = UIBlurEffect(style: .prominent)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
groupTable.backgroundView = blurEffectView
} else {
let blurEffect = UIBlurEffect(style: .dark)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
groupTable.backgroundView = blurEffectView
}