Agregar una capa de máscara borrosa de círculo en UIView

Estoy trabajando con Xcode 8 y Swift 2.3
A partir de esta bonita publicación y mi propia pregunta , puedo get estos dos efectos distintos, pero no puedo "unirme".

introduzca la descripción de la imagen aquí :

Primero uno ( desenfoque ):

internal extension UIView { /** Add and display on current view a blur effect. */ internal func addBlurEffect(style style: UIBlurEffectStyle = .ExtraLight, atPosition position: Int = -1) -> UIView { // Blur Effect let blurEffectView = self.createBlurEffect(style: style) if position >= 0 { self.insertSubview(blurEffectView, atIndex: position) } else { self.addSubview(blurEffectView) } return blurEffectView } internal func createBlurEffect(style style: UIBlurEffectStyle = .ExtraLight) -> UIView { let blurEffect = UIBlurEffect(style: style) let blurEffectView = UIVisualEffectView(effect: blurEffect) blurEffectView.frame = self.bounds blurEffectView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] return blurEffectView } } 

Segundo ( gradiente radial ):

 public class BlurFilterMask: CAShapeLayer { // MARK: - Public properties - public var origin: CGPoint = CGPointZero public var diameter: CGFloat = 0.0 public var gradientWidth: CGFloat = 200.0 public var gradientColorOpacity: CGFloat = 0.5 // MARK: - Layout - override public func drawInContext(ctx: CGContext) { let clearRegionRadius = self.diameter * 0.5 let blurRegionRadius = clearRegionRadius + self.gradientWidth let baseColorSpace = CGColorSpaceCreateDeviceRGB() let colours: [CGFloat] = [0.0, 0.0, 0.0, 0.0, // Clear region 0.0, 0.0, 0.0, self.gradientColorOpacity] // blur region color let colourLocations: [CGFloat] = [0.0, 0.4] let gradient = CGGradientCreateWithColorComponents (baseColorSpace, colours, colourLocations, 2) CGContextDrawRadialGradient(ctx, gradient!, self.origin, clearRegionRadius, self.origin, blurRegionRadius, .DrawsAfterEndLocation) } } 

¡Cualquier consejo sería apreciado!

¡Lo hice!

Observe que self es una máscara UIView agregada en la parte superior de la jerarquía.

 func setupBlur(frame frame: CGRect, center: CGPoint, diameter: CGFloat) { self.blurFilterMask = BlurFilterMask() self.blurFilterMask.diameter = diameter self.blurFilterMask.frame = self.frame self.blurFilterMask.origin = center self.blurFilterMask.shouldRasterize = true self.layer.addSublayer(self.blurFilterMask) self.blurFilterMask.setNeedsDisplay() self.viewBlur = self.addBlurEffect(style: self.blurEffectStyle, atPosition: 0) self.holePath = self.getHolePath(frame: frame, center: center, diameter: diameter) self.addMaskOnBlurView(self.holePath, center: center, diameter: diameter) } func addMaskOnBlurView(holePath: UIBezierPath, center: CGPoint, diameter: CGFloat?) -> UIView { let maskView = UIView(frame: self.viewBlur!.bounds) maskView.clipsToBounds = true maskView.backgroundColor = UIColor.clearColor() let blurFilterMask = ERBlurFilterMask() blurFilterMask.diameter = diameter ?? 10 blurFilterMask.frame = self.frame blurFilterMask.origin = center blurFilterMask.shouldRasterize = true blurFilterMask.gradientColorOpacity = 1 maskView.layer.addSublayer(blurFilterMask) blurFilterMask.setNeedsDisplay() self.viewBlur!.maskView = maskView return maskView } 

Resumiendo:

  • Crea una vista de máscara como superposition, llámala A
  • agregar máscara de filter de desenfoque en las capas de A
  • cree una vista borrosa, llámela B y anexe en la parte superior
  • cree otra vista, llámela C y agregue otra máscara de filter
  • aplicar C como máscaraView de B

No sé si esta es LA solución, pero funcionó para mí. ¡Si alguien tiene otra solución mejor por favor compártala!