Добавление эффекта размытия к фону в swift
Я устанавливаю фоновое изображение для просмотра контроллера. Но также я хочу добавить эффект размытия к этому фону. Как я могу это сделать?
Я устанавливаю фон со следующим кодом:
self.view.backgroundColor = UIColor(patternImage: UIImage(named: "testBg")!)
Я нашел в интернете для размытия книги, Как я могу реализовать это на моем фоне?
var darkBlur = UIBlurEffect(style: UIBlurEffectStyle.Dark)
// 2
var blurView = UIVisualEffectView(effect: darkBlur)
blurView.frame = imageView.bounds
// 3
imageView.addSubview(blurView)
7 ответов:
Я проверил этот код и он работает нормально:
let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Dark) let blurEffectView = UIVisualEffectView(effect: blurEffect) blurEffectView.frame = view.bounds blurEffectView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] view.addSubview(blurEffectView)
Для 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)
здесь вы можете видеть результат:
или вы можете использовать эту библиотеку для этого:
вы можете сделать расширение 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) } }
использование:
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) } }
использование:
yourImageView.addBlurEffect()
дополнение:
extension UIView { /// Remove UIBlurEffect from UIView func removeBlurEffect() { let blurredEffectViews = self.subviews.filter{ is UIVisualEffectView} blurredEffectViews.forEach{ blurView in blurView.removeFromSuperview() } } }
@AlvinGeorge нужно просто использовать:
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) } }
использование:
blurredBackground.frame = self.view.bounds blurredBackground.blurImage() self.view.addSubview(self.blurredBackground)
для Swift 3 (iOS 10.0 и 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 также может использовать CoreImage для создания размытого изображения с темным эффектом
сделать снимок для изображения
func snapShotImage() -> UIImage { UIGraphicsBeginImageContext(self.frame.size) if let context = UIGraphicsGetCurrentContext() { self.layer.renderInContext(context) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } return UIImage() }
применить фильтры CoreImage, как вы хотите с
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() }
нашел другой способ.. Я использую UIImage+ImageEffects от apple.
UIImage *effectImage = [image applyExtraLightEffect]; self.imageView.image = effectImage;
этот всегда держит правильный кадр:
public extension UIView { @discardableResult public func addBlur(style: UIBlurEffectStyle = .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 } }