簡體   English   中英

UIViewController下具有模糊效果的黑色或灰色背景

[英]Black or grey background under UIViewController with blur effect

我的應用程序( 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的背景為灰色。 這是可以理解的,它后面的所有區域都沒有重繪,但這是一個問題。

灰色背景

第三個問題:如果該用戶嘗試關閉我模糊的控制器,則第一個控制器只是黑色的。

我知道我可以解決最后兩個問題:

  1. viewDidDisappear關閉模糊控制器。

  2. 記住其父控制器中的“模糊狀態”。

  3. 如果用戶回來了,請再次顯示模糊的控制器。

但是,也許有一種更優雅,更簡單的方法?

嘗試以下代碼:在Swift 3中測試。

第一創投

   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)
}  

}

代碼輸出:

注意:由於ScreenCast而不是代碼的緣故,模糊效果似乎並不完美...

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM