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
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)
U can also use CoreImage to create blurred image with dark effect
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()
}
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()
}
This worked for me on Swift 5
let blurredView = UIVisualEffectView(effect: UIBlurEffect(style: .light))
blurredView.frame = self.view.bounds
backgroundimage.addSubview(blurredView)
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:
Or you can use this lib for that:
https://github.com/FlexMonkey/Blurable
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
}
}