UIVisualEffectView avec couche de masque

J'essaie de brouiller un MKMapView tout en affichant un masque circulaire au-dessus. Pour mieux visualiser ce que je veux dire avec cela, vous pouvez find une image de mon état actuel ci-joint:

État actuel

Cela montre à peu près ce que je veux mais le fond (la carte) devrait être flou ce qui n'est pas le cas sur cette photo. J'ai essayé de travailler avec UIVisualEffectView, mais il semble que je fasse quelque chose de mal là-bas. Voici ce que j'ai essayé:

func createOverlay(at: CGPoint) { var blur: UIView! blur = UIVisualEffectView (effect: UIBlurEffect (style: UIBlurEffectStyle.dark)) blur.frame = self.mapView.frame blur.isUserInteractionEnabled = false self.mapView.addSubview(blur) let circleSize: CGFloat = 200 let path = UIBezierPath ( roundedRect: blur.frame, cornerRadius: 0) let circle = UIBezierPath ( roundedRect: CGRect (origin: CGPoint(x:at.x - circleSize/2, y: at.y-circleSize/2), size: CGSize (width: circleSize, height: circleSize)), cornerRadius: circleSize/2) path.append(circle) path.usesEvenOddFillRule = true let maskLayer = CAShapeLayer() maskLayer.path = path.cgPath maskLayer.fillRule = kCAFillRuleEvenOdd let borderLayer = CAShapeLayer() borderLayer.path = circle.cgPath borderLayer.strokeColor = UIColor.white.cgColor borderLayer.lineWidth = 10 blur.layer.addSublayer(borderLayer) blur.layer.mask = maskLayer } 

Pour résumer ici est ma question: Comment dois-je changer mon code afin de brouiller le mapview ainsi que montrer le masque de cirlce au-dessus d'elle?

EDIT Je viens de découvrir que le flou de la mapview fonctionne si je supprime le code pour append le masque de cercle … Peut-être que cela a de l'intérêt pour résoudre ce problème.

J'ai maintenant trouvé une solution après avoir creusé un peu. Je suppose que vous utilisez Xcode 8 comme calque. Mask a un bug connu où vous ne pouvez pas avoir à la fois un flou et un masque sur le même calque.

Après avoir joué avec un terrain de jeu, j'ai résolu le problème, donc j'essaierai d'adapter votre code pour qu'il corresponde à ma solution. Si vous utilisez à la place la propriété "mask" de blurView, vous ne devriez avoir aucun problème. Il y a eu un rapport de bug fait à Apple je crois en ce qui concerne le calque.

Ceci est votre code actuel à la fin

 let maskLayer = CAShapeLayer() maskLayer.path = path.cgPath maskLayer.fillRule = kCAFillRuleEvenOdd let borderLayer = CAShapeLayer() borderLayer.path = circle.cgPath borderLayer.strokeColor = UIColor.white.cgColor borderLayer.lineWidth = 10 blur.layer.addSublayer(borderLayer) blur.layer.mask = maskLayer 

Au lieu de cela, essayez d'utiliser ce qui suit:

 let maskLayer = CAShapeLayer() maskLayer.path = path.cgPath maskLayer.fillRule = kCAFillRuleEvenOdd let borderLayer = CAShapeLayer() borderLayer.path = circle.cgPath borderLayer.strokeColor = UIColor.white.cgColor borderLayer.fillColor = UIColor.clear.cgColor //Remember this line, it caused me some issues borderLayer.lineWidth = 10 let maskView = UIView(frame: self.view.frame) maskView.backgroundColor = UIColor.black maskView.layer.mask = maskLayer blur.layer.addSublayer(borderLayer) blur.mask = maskView 

Faites-moi savoir si vous avez des problèmes!