Adding blur effect to background in swift

IosSwift

Ios Problem Overview


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 code:

self.view.backgroundColor = UIColor(patternImage: UIImage(named: "testBg")!)

I found on internet for blur imageview how can i implement this to my background?

var darkBlur = UIBlurEffect(style: UIBlurEffectStyle.Dark)
// 2
var blurView = UIVisualEffectView(effect: darkBlur)
blurView.frame = imageView.bounds
// 3
imageView.addSubview(blurView)

Ios Solutions


Solution 1 - Ios

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

Solution 2 - Ios

You can make an extension of UIImageView.

Swift 2.0

import Foundation
import UIKit

extension UIImageView
{
    func makeBlurImage(targetImageView:UIImageView?)
    {
        let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Dark)
        let blurEffectView = UIVisualEffectView(effect: blurEffect)
        blurEffectView.frame = targetImageView!.bounds

        blurEffectView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] // for supporting device rotation
        targetImageView?.addSubview(blurEffectView)
    }
}

Usage:

override func viewDidLoad()
{
    super.viewDidLoad()

    let sampleImageView = UIImageView(frame: CGRectMake(0, 200, 300, 325))
    let sampleImage:UIImage = UIImage(named: "ic_120x120")!
    sampleImageView.image =  sampleImage

    //Convert To Blur Image Here
    sampleImageView.makeBlurImage(sampleImageView)

    self.view.addSubview(sampleImageView)
}

Swift 3 Extension

import Foundation
import UIKit

extension UIImageView
{
    func addBlurEffect()
    {
        let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.light)
        let blurEffectView = UIVisualEffectView(effect: blurEffect)
        blurEffectView.frame = self.bounds

        blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight] // for supporting device rotation
        self.addSubview(blurEffectView)
    }
}

Usage:

yourImageView.addBlurEffect()

Addendum:

extension UIView {
  
  /// Remove UIBlurEffect from UIView
  func removeBlurEffect() {
    let blurredEffectViews = self.subviews.filter{$0 is UIVisualEffectView}
    blurredEffectViews.forEach{ blurView in
      blurView.removeFromSuperview()
    }
  }

Swift 5.0:

import UIKit


extension UIImageView {
    func applyBlurEffect() {
        let blurEffect = UIBlurEffect(style: .light)
        let blurEffectView = UIVisualEffectView(effect: blurEffect)
        blurEffectView.frame = bounds
        blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        addSubview(blurEffectView)
    }
}

Solution 3 - Ios

@AlvinGeorge should just use:

extension UIImageView{        
    func blurImage()
    {
        let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Dark)
        let blurEffectView = UIVisualEffectView(effect: blurEffect)
        blurEffectView.frame = self.bounds
        
        blurEffectView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] // for supporting device rotation
        self.addSubview(blurEffectView)
    }
}

usage:

 blurredBackground.frame = self.view.bounds
 blurredBackground.blurImage()
 self.view.addSubview(self.blurredBackground)

Solution 4 - Ios

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

Solution 5 - Ios

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)

Solution 6 - Ios

This worked for me on Swift 5

let blurredView = UIVisualEffectView(effect: UIBlurEffect(style: .light))
blurredView.frame = self.view.bounds
backgroundimage.addSubview(blurredView)
        

Solution 7 - Ios

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

Solution 8 - Ios

You should always use .dark for style and add the following code to make it look cool

    blurEffectView.backgroundColor = .black
    blurEffectView.alpha = 0.4

Solution 9 - Ios

This Code is Working Fine For me! its for Swift 4.x

let blurEffect = UIBlurEffect(style: .ExtraLight)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
blurEffectView.frame = self.view.frame
self.view.insertSubview(blurEffectView, atIndex: 0)

Solution 10 - Ios

In a UIView extension:

func addBlurredBackground(style: UIBlurEffect.Style) {
    let blurEffect = UIBlurEffect(style: style)
    let blurView = UIVisualEffectView(effect: blurEffect)
    blurView.frame = self.frame
    blurView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    self.addSubview(blurView)
    self.sendSubviewToBack(blurView)
}

Solution 11 - Ios

Found another way.. I use apple's UIImage+ImageEffects.

 UIImage *effectImage = [image applyExtraLightEffect];                        
 self.imageView.image = effectImage;

Solution 12 - Ios

let blurEffect = UIBlurEffect(style: UIBlurEffect.Style.dark)
                    let blurEffectView = UIVisualEffectView(effect: blurEffect)
                    blurEffectView.backgroundColor = .black
                    blurEffectView.alpha = 0.5
                    blurEffectView.frame = topView.bounds
                    if !self.presenting {
                        blurEffectView.frame.origin.x = 0
                    } else {
                        blurEffectView.frame.origin.x = -topView.frame.width
                    }
                    blurEffectView.frame.origin.x = -topView.frame.width
                    blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
                    UIView.animate(withDuration: 0.2, delay: 0.0, options: [.curveEaseIn]) {
                        if !self.presenting {
                            blurEffectView.frame.origin.x = -topView.frame.width
                        } else {
                            blurEffectView.frame.origin.x = 0
                        }
                        view.addSubview(blurEffectView)
                    } completion: { (status) in
                        
                    }

Solution 13 - Ios

Thanks to @Maruta https://stackoverflow.com/a/56334283/16457129 for the answer If anyone else asks, you can reduce the blur effect with the background color of the view.

    func drawBackgroundBlur() {
        backgroundView.layer.cornerRadius = 27
        // Here, you can increase the alpha value to increase the blur effect
        backgroundView.backgroundColor = UIColor.white.withAlphaComponent(0.05)
        
        let blurredView = UIVisualEffectView(effect: UIBlurEffect(style: .light))
        blurredView.frame = backgroundRewardsView.bounds
        blurredView.layer.cornerRadius = 27
        backgroundView.addSubview(blurredView)
    }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTolgay ToklarView Question on Stackoverflow
Solution 1 - IosDharmesh KheniView Answer on Stackoverflow
Solution 2 - IosAlvin GeorgeView Answer on Stackoverflow
Solution 3 - IosBlain EllisView Answer on Stackoverflow
Solution 4 - IoshbkView Answer on Stackoverflow
Solution 5 - IosRajamohan SView Answer on Stackoverflow
Solution 6 - IosMarutaView Answer on Stackoverflow
Solution 7 - IosJ. DoeView Answer on Stackoverflow
Solution 8 - IosDonovan MarshView Answer on Stackoverflow
Solution 9 - IosapollovishwasView Answer on Stackoverflow
Solution 10 - IosSunkasView Answer on Stackoverflow
Solution 11 - IosJenel Ejercito MyersView Answer on Stackoverflow
Solution 12 - Iospramod TomarView Answer on Stackoverflow
Solution 13 - IosstarmarmorView Answer on Stackoverflow