Adding blur effect to background in swift

前端 未结 11 1810
鱼传尺愫
鱼传尺愫 2020-11-29 14:50

I am setting a background image to view controller. But also i want to add blur effect to this background. How can I do this?

I am setting background with following

相关标签:
11条回答
  • 2020-11-29 15:17

    For Swift 3 (iOS 10.0 and 8.0)

    var darkBlur:UIBlurEffect = UIBlurEffect()
    
    if #available(iOS 10.0, *) { //iOS 10.0 and above
        darkBlur = UIBlurEffect(style: UIBlurEffectStyle.prominent)//prominent,regular,extraLight, light, dark
    } else { //iOS 8.0 and above
      darkBlur = UIBlurEffect(style: UIBlurEffectStyle.dark) //extraLight, light, dark
    }
    let blurView = UIVisualEffectView(effect: darkBlur)
    blurView.frame = self.view.frame //your view that have any objects
    blurView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    view.addSubview(blurView)
    
    0 讨论(0)
  • 2020-11-29 15:22

    U can also use CoreImage to create blurred image with dark effect

    1. Make snapshot for image

      func snapShotImage() -> UIImage {
          UIGraphicsBeginImageContext(self.frame.size)
          if let context = UIGraphicsGetCurrentContext() {
              self.layer.renderInContext(context)
              let image = UIGraphicsGetImageFromCurrentImageContext()
              UIGraphicsEndImageContext()
              return image
          }
      
          return UIImage()
      }
      
    2. Apply CoreImage Filters as u wish with

      private func bluredImage(view:UIView, radius:CGFloat = 1) -> UIImage {
      let image = view.snapShotImage()
      
      if let source = image.CGImage {
          let context = CIContext(options: nil)
          let inputImage = CIImage(CGImage: source)
      
          let clampFilter = CIFilter(name: "CIAffineClamp")
          clampFilter?.setDefaults()
          clampFilter?.setValue(inputImage, forKey: kCIInputImageKey)
      
          if let clampedImage = clampFilter?.valueForKey(kCIOutputImageKey) as? CIImage {
              let explosureFilter = CIFilter(name: "CIExposureAdjust")
              explosureFilter?.setValue(clampedImage, forKey: kCIInputImageKey)
              explosureFilter?.setValue(-1.0, forKey: kCIInputEVKey)
      
              if let explosureImage = explosureFilter?.valueForKey(kCIOutputImageKey) as? CIImage {
                  let filter = CIFilter(name: "CIGaussianBlur")
                  filter?.setValue(explosureImage, forKey: kCIInputImageKey)
                  filter?.setValue("\(radius)", forKey:kCIInputRadiusKey)
      
                  if let result = filter?.valueForKey(kCIOutputImageKey) as? CIImage {
                      let bounds = UIScreen.mainScreen().bounds
                      let cgImage = context.createCGImage(result, fromRect: bounds)
                      let returnImage = UIImage(CGImage: cgImage)
                      return returnImage
                  }
              }
          }
      }
      return UIImage()
      }
      
    0 讨论(0)
  • 2020-11-29 15:23

    This worked for me on Swift 5

    let blurredView = UIVisualEffectView(effect: UIBlurEffect(style: .light))
    blurredView.frame = self.view.bounds
    backgroundimage.addSubview(blurredView)
    
    0 讨论(0)
  • 2020-11-29 15:32

    I have tested this code and it's working fine:

    let blurEffect = UIBlurEffect(style: UIBlurEffect.Style.dark)
    let blurEffectView = UIVisualEffectView(effect: blurEffect)
    blurEffectView.frame = view.bounds
    blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    view.addSubview(blurEffectView)
    

    For Swift 3.0:

    let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
    let blurEffectView = UIVisualEffectView(effect: blurEffect)
    blurEffectView.frame = view.bounds
    blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    view.addSubview(blurEffectView)
    

    For Swift 4.0:

    let blurEffect = UIBlurEffect(style: UIBlurEffect.Style.dark)
    let blurEffectView = UIVisualEffectView(effect: blurEffect)
    blurEffectView.frame = view.bounds
    blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    view.addSubview(blurEffectView)
    

    Here you can see result:

    blurred view

    Or you can use this lib for that:

    https://github.com/FlexMonkey/Blurable

    0 讨论(0)
  • 2020-11-29 15:32

    This one always keeps the right frame:

    public extension UIView {
    
        @discardableResult
        public func addBlur(style: UIBlurEffect.Style = .extraLight) -> UIVisualEffectView {
            let blurEffect = UIBlurEffect(style: style)
            let blurBackground = UIVisualEffectView(effect: blurEffect)
            addSubview(blurBackground)
            blurBackground.translatesAutoresizingMaskIntoConstraints = false
            blurBackground.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
            blurBackground.topAnchor.constraint(equalTo: topAnchor).isActive = true
            blurBackground.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
            blurBackground.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
            return blurBackground
        }
    }
    
    0 讨论(0)
提交回复
热议问题