Вы не можете контролировать радиус размытия UIVisualEffectView
. Вы можете добиться того, чего хотите, сделав снимок вида, который вы хотите размыть, и применив фильтр CoreImage «CIGaussianBlur» к этому снимку, а затем отобразив размытое изображение в UIImageView
, расположенном непосредственно над видом, который вы хотите размыть. С помощью CIGaussianBlur
вы можете применить радиус размытия к произвольной длине.
Вы можете использовать расширение на UIView
, чтобы сделать это более удобным:
extension UIView
{
func snapshotView(scale scale: CGFloat = 0.0, isOpaque: Bool = true) -> UIImage
{
UIGraphicsBeginImageContextWithOptions(self.bounds.size, opaque, scale)
self.drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
func blur(blurRadius blurRadius: CGFloat) -> UIImage?
{
guard let blur = CIFilter(name: "CIGaussianBlur") else { return nil }
let image = self.snapshotView(scale: 1.0, isOpaque: true)
blur.setValue(CIImage(image: image), forKey: kCIInputImageKey)
blur.setValue(blurRadius, forKey: kCIInputRadiusKey)
let ciContext = CIContext(options: nil)
let result = blur.valueForKey(kCIOutputImageKey) as! CIImage!
let boundingRect = CGRect(x: 0,
y: 0,
width: frame.width,
height: frame.height)
let cgImage = ciContext.createCGImage(result, fromRect: boundingRect)
return UIImage(CGImage: cgImage)
}
}
Затем вы можете добавить полупрозрачное наложение, чтобы определить, насколько темным будет размытие, например:
let overlay = UIView()
overlay.frame = view.bounds
overlay.backgroundColor = UIColor(white: 0.0, alpha: 0.30)
viewIWantToBlur.addSubview(overlay)
let image = viewIWantToBlur.blur(blurRadius: 2.0)
imageView.image = image
Дополнительную информацию об этом методе и более надежный рабочий пример можно найти здесь. требует высокой производительности.
person
beyowulf
schedule
13.08.2016