在UIViewController下的黑或灰色背景有迷离作用的

时间:2016-10-20 12:22:36

标签: ios swift uiviewcontroller uiblureffect

我的应用程序中有几个选项卡(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)

我在这里遇到的第一个问题,其他标签仍然可以访问。用户可以点击它们而不会忽略我模糊的控制器。

Tab items are still accessible

这不是一个真正的问题,但是当这个用户回来时,我模糊的viewcontroller有灰色背景。这是可以理解的,它背后的所有领域都没有重新绘制,但这是一个问题。

Gray background

第三个问题:如果该用户试图关闭我模糊的控制器,则第一个控制器只是黑色。

我知道我可以用这个来解决最后两个问题:

  1. viewDidDisappear中解除模糊的控制器。

  2. 记住"模糊状态"在其父控制器中。

  3. 如果用户回来,再次显示模糊的控制器。

  4. 但也许有更优雅和简单的方法?

1 个答案:

答案 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不是来自代码...

enter image description here