我的应用程序中有几个选项卡(UITabBarController
),其中一个我可以显示带模糊效果的模态UIViewController(通过选项卡中的当前控制器)。
let bVC = BlurViewController()
bVC.modalPresentationStyle = .overCurrentContext
self.present(bVC, animated: true, completion: nil)
模糊控制器只是一个简单的UIViewController
,其代码位于viewDidLoad
:
let blurEffect = UIBlurEffect(style: .extraLight)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
blurEffectView.frame = self.view.frame
self.view.insertSubview(blurEffectView, at: 0)
我在这里遇到的第一个问题,其他标签仍然可以访问。用户可以点击它们而不会忽略我模糊的控制器。
这不是一个真正的问题,但是当这个用户回来时,我模糊的viewcontroller有灰色背景。这是可以理解的,它背后的所有领域都没有重新绘制,但这是一个问题。
第三个问题:如果该用户试图关闭我模糊的控制器,则第一个控制器只是黑色。
我知道我可以用这个来解决最后两个问题:
在viewDidDisappear
中解除模糊的控制器。
记住"模糊状态"在其父控制器中。
如果用户回来,再次显示模糊的控制器。
但也许有更优雅和简单的方法?
答案 0 :(得分:0)
试试这段代码:在Swift 3中测试。
第一次VC
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
title = "First VC"
//To set Background image
let backgroundImage = UIImage(named: "Set any image for 1st VC")
view.backgroundColor = UIColor(patternImage: backgroundImage!)
imageView.contentMode = .scaleToFill
// To set BlurView
let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.light)
let blurView = UIVisualEffectView(effect: blurEffect)
blurView.frame = view.frame
imageView.addSubview(blurView)
}
// First VC barButton
Note: Connect firstVc to SecondVc using segue and set identifier name to **one**
@IBAction func toSecondVC(_ sender: AnyObject) {
performSegue(withIdentifier: "one", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "one") {
navigationController?.navigationBar.isHidden = false
navigationController?.toolbar.isHidden = false
}
}
}
<强> SecondVC 强>
import UIKit
class viewTwo: UIViewController {
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
title = "Second VC"
let backgroundImage = UIImage(named: "Set any image for 2nd VC")
view.backgroundColor = UIColor(patternImage: backgroundImage!)
imageView.contentMode = .scaleToFill
let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.light)
let blurView = UIVisualEffectView(effect: blurEffect)
blurView.frame = view.frame
imageView.addSubview(blurView)
}
override func viewWillAppear(_ animated: Bool) {
self.navigationItem.setHidesBackButton(true, animated:true)
}
@IBAction func backToMainVC(_ sender: AnyObject) {
// dismiss(animated: true, completion: nil)
navigationController?.popViewController(animated: true)
}
}
代码输出:
注意:Blur看起来不完美,因为ScreenCast不是来自代码...