UIVisualEffectView с слоем маски

Я пытаюсь размыть MKMapView, показывая над ним круговую маску. Чтобы лучше понять, что я имею в виду, вы можете найти изображение моего текущего состояния:

Текущее состояние

Это показывает почти то, что я хочу, но фон (карта) должен быть размытым, что не так на этом рисунке. Я пытался работать с UIVisualEffectView, но кажется, что я делаю что-то не так. Вот что я пробовал:

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
}

Подводя итог, вот мой вопрос: Как мне изменить свой код, чтобы размыть карту, а также показать маску cirlce над ней?

ИЗМЕНИТЬ Просто выяснилось, что размытие mapview работает, если я удалю код для добавления маски круга... Возможно, это представляет интерес для решения этой проблемы.

Ответы

Ответ 1

Теперь я нашел решение после того, как поработал немного. Я предполагаю, что вы используете Xcode 8, поскольку layer.mask имеет известную ошибку, в которой вы не можете иметь размытие и маску на том же слое.

После беспорядка с игровой площадкой я исправил проблему, поэтому попытаюсь адаптировать ваш код в соответствии с моим решением. Если вы вместо этого используете свойство "mask" для blurView, тогда у вас не должно быть проблем. Был отчет об ошибке, сделанный Apple. Я верю в отношении того, что layer.mask не работает.

Это ваш текущий код в конце

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

Вместо этого попробуйте использовать следующее:

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

Сообщите мне, есть ли у вас какие-либо проблемы!