2016-11-08 3 views
3

Ich arbeite mit Xcode 8 und Swift 2.3
von this nice post Ab Hinzufügen und my own question kann ich diese zwei unterschiedliche Effekte bekommen, aber ich kann nicht „join“ es.einen Kreis unscharfe Maskenschicht auf UIView

enter image description here:

erste (Unschärfe):

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 
    } 

} 

zweite (radiale Gradienten):

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

würde geschätzt Irgendwelche Tipps!

+0

hast du nicht kürzlich eine ähnliche Frage gestellt? http://stackoverflow.com/questions/40256942/draw-hole-on-uiblureffect/40401855#40401855 –

+0

Ähnlich kann ich nicht einen radialen Gradienten auf das Loch anwenden ... Ich habe versucht mit allen möglichen Kombinationen! –

Antwort

0

Ich habe es geschafft!

Hinweis, dass self ist eine Maske UIView oben auf der Hierarchie hinzugefügt.

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 
} 

Summieren:

  • erstellen als Overlay-Maske Ansicht, nennen es eine
  • Add Blurfilter Maske auf die Schichten
  • Unschärfe Ansicht erstellen, rufen Sie es B, und hängen Sie oben
  • Erstellen Sie eine andere Ansicht, nennen Sie sie C, und fügen Sie eine weitere Filtermaske hinzu
  • wenden Sie C als maskView von B an

Ich weiß nicht, ob das die Lösung ist, aber es hat für mich funktioniert. Wenn jemand eine andere bessere Lösung hat, bitte teilen Sie es!