Маска VisualEffect Blur с нарисованным изображением

Так что в моем быстром приложении я позволяю пользователю рисовать пальцем на ощупь. Я использую cgcontext, чтобы сделать это. После того, как пользователь поднял палец и касание заканчивается, я динамически добавляю вид визуального эффекта поверх фигуры с той же высотой и шириной нарисованной фигуры. Далее я хочу использовать форму в качестве маски для визуального эффекта. Проблема сейчас в том, пытаюсь ли я замаскировать визуальный эффект с помощью фигуры. замаскированный вид не отображается, если исходная точка фигуры не равна (0,0). Вот ссылка на то, как я сейчас пытаюсь реализовать это ( https://pastebin.com/JaM9kx4G)

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    swiped = false
    if let touch = touches.first as? UITouch {
        if (touch.view == sideView){
            return
        }
        tempPath = UIBezierPath()
        lastPoint = touch.location(in: view)
        tempPath.move(to:lastPoint)
    }

}

func drawLineFrom(fromPoint: CGPoint, toPoint: CGPoint) {
    tempPath.addLine(to: CGPoint(x: toPoint.x, y: toPoint.y))
    UIGraphicsBeginImageContext(view.frame.size)
    let context = UIGraphicsGetCurrentContext()
    otherImageView.image?.draw(in: CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height))

    // 2
    context!.move(to: CGPoint(x:fromPoint.x,y:fromPoint.y))
    context!.addLine(to: CGPoint(x:toPoint.x, y:toPoint.y))
    // 3
    context!.setLineCap(CGLineCap.round)
    context!.setLineWidth(brushWidth)
    context!.setStrokeColor(red: red, green: green, blue: blue, alpha: 1.0)
    context!.setBlendMode(CGBlendMode.normal)


    // 4
    context!.strokePath()

    // 5
    otherImageView.image = UIGraphicsGetImageFromCurrentImageContext()
    otherImageView.alpha = opacity
    UIGraphicsEndImageContext()
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    swiped = true
    if let touch = touches.first as? UITouch {
        let currentPoint = touch.location(in: view)
        drawLineFrom(fromPoint: lastPoint, toPoint: currentPoint)
        // 7
        lastPoint = currentPoint
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    tempPath.close()
    let tempImage = UIImageView(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height))

    UIGraphicsBeginImageContext(tempImage.frame.size)

    tempImage.image?.draw(in: CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height), blendMode: CGBlendMode.normal, alpha: 1.0)
    otherImageView.image?.draw(in: CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height), blendMode: CGBlendMode.normal, alpha: opacity)
    let context = UIGraphicsGetCurrentContext()
    let image = UIGraphicsGetImageFromCurrentImageContext()
    tempImage.image = image
    otherImageView.image = nil
    imageView.addSubview(tempImage)

    let blur = VisualEffectView()
    blur.frame = CGRect(x:tempPath.bounds.origin.x,y:tempPath.bounds.origin.y, width:tempPath.bounds.width, height:tempPath.bounds.height)
    blur.blurRadius = 5
    blur.layer.mask = tempImage.layer
}

0 ответов

Другие вопросы по тегам