Less Blur with `Visual Effect View with Blur`?

后端 未结 11 1287
死守一世寂寞
死守一世寂寞 2020-12-08 10:11

Title pretty much asks it all...

I\'m playing with the iOS8 Visual Effect View with Blur. It\'s over a UIImageView that shows a user choosa

11条回答
  •  醉梦人生
    2020-12-08 10:40

    This answer is based on Mitja Semolic's excellent earlier answer. I've converted it to swift 3, added an explanation to what's happening in coments, made it an extension of a UIViewController so any VC can call it at will, added an unblurred view to show selective application, and added a completion block so that the calling view controller can do whatever it wants at the completion of the blur.

        import UIKit
    //This extension implements a blur to the entire screen, puts up a HUD and then waits and dismisses the view.
        extension UIViewController {
            func blurAndShowHUD(duration: Double, message: String, completion: @escaping () -> Void) { //with completion block
                //1. Create the blur effect & the view it will occupy
                let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.light)
                let blurEffectView = UIVisualEffectView()//(effect: blurEffect)
                blurEffectView.frame = self.view.bounds
                blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    
            //2. Add the effect view to the main view
                self.view.addSubview(blurEffectView)
            //3. Create the hud and add it to the main view
            let hud = HudView.getHUD(view: self.view, withMessage: message)
            self.view.addSubview(hud)
            //4. Begin applying the blur effect to the effect view
            UIView.animate(withDuration: 0.01, animations: {
                blurEffectView.effect = blurEffect
            })
            //5. Halt the blur effects application to achieve the desired blur radius
            self.view.pauseAnimationsInThisView(delay: 0.004)
            //6. Remove the view (& the HUD) after the completion of the duration
            DispatchQueue.main.asyncAfter(deadline: .now() + duration) {
                blurEffectView.removeFromSuperview()
                hud.removeFromSuperview()
                self.view.resumeAnimationsInThisView()
                completion()
            }
        }
    }
    
    extension UIView {
        public func pauseAnimationsInThisView(delay: Double) {
            let time = delay + CFAbsoluteTimeGetCurrent()
            let timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, time, 0, 0, 0, { timer in
                let layer = self.layer
                let pausedTime = layer.convertTime(CACurrentMediaTime(), from: nil)
                layer.speed = 0.0
                layer.timeOffset = pausedTime
            })
            CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, CFRunLoopMode.commonModes)
        }
        public func resumeAnimationsInThisView() {
            let pausedTime  = layer.timeOffset
    
            layer.speed = 1.0
            layer.timeOffset = 0.0
            layer.beginTime = layer.convertTime(CACurrentMediaTime(), from: nil) - pausedTime
        }
    }
    

    I've confirmed that it works with both iOS 10.3.1 and iOS 11

提交回复
热议问题