Swift: Как закрепить слой для просмотра?

Я пытался привязать CAShapeLayer к представлению уже несколько дней. Я не мог найти решение для этого. Это проект Facetracker. Я хочу создать круглый CAShapeLayer, который я мог бы поместить в фиксированное положение в eyeglassesView. Однако, когда вы поворачиваете голову, вид изменяется, поэтому CAShapeLayer не может оставаться поверх очков, чтобы служить линзой. Я планирую создать анимацию, но мне нужно, чтобы CAShapeLayer сначала держался на своем месте независимо от того, под каким углом я двигаю лицо.

func faceTrackerDidUpdate(points: FacePoints?) {
    let eyeCornerDist = sqrt(pow(points.leftEye[0].x - points.rightEye[5].x, 2) + pow(points.leftEye[0].y - points.rightEye[5].y, 2))
    let eyeToEyeCenter = CGPointMake((points.leftEye[0].x + points.rightEye[5].x) / 2, (points.leftEye[0].y + points.rightEye[5].y) / 2)

    let eyeglassesWidth = 1.5 * eyeCornerDist
    let eyeglassesHeight = (eyeglassesView.image!.size.height / eyeglassesView.image!.size.width) * eyeglassesWidth

    eyeglassesView.transform = CGAffineTransformIdentity

    eyeglassesView.frame = CGRectMake(eyeToEyeCenter.x - eyeglassesWidth / 2, eyeToEyeCenter.y - 0.5 * eyeglassesHeight, eyeglassesWidth, eyeglassesHeight)

    let layer = CAShapeLayer()
    layer.anchorPoint = CGPointMake(0.0, 1.0)
    layer.position = CGPointMake(0.0, 150.0)
    layer.path = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: 80, height: 80), cornerRadius: 80).CGPath
    layer.fillColor = UIColor(white: 1, alpha: 0.08).CGColor

    eyeglassesView.layer.addSublayer(layer)

    eyeglassesView.hidden = false

    setAnchorPoint(CGPointMake(0.5, 1.0), forView: eyeglassesView)

    let angle = atan2(points.rightEye[5].y - points.leftEye[0].y, points.rightEye[5].x - points.leftEye[0].x)
    eyeglassesView.transform = CGAffineTransformMakeRotation(angle)
}

func setAnchorPoint(anchorPoint: CGPoint, forView view: UIView) {
    var newPoint = CGPointMake(view.bounds.size.width * anchorPoint.x, view.bounds.size.height * anchorPoint.y)
    var oldPoint = CGPointMake(view.bounds.size.width * view.layer.anchorPoint.x, view.bounds.size.height * view.layer.anchorPoint.y)

    newPoint = CGPointApplyAffineTransform(newPoint, view.transform)
    oldPoint = CGPointApplyAffineTransform(oldPoint, view.transform)

    var position = view.layer.position
    position.x -= oldPoint.x
    position.x += newPoint.x

    position.y -= oldPoint.y
    position.y += newPoint.y

    view.layer.position = position
    view.layer.anchorPoint = anchorPoint
}

Я пробовал разные вещи, положение, привязку, маскировку, трансформацию, но я действительно не знаю, как заставить это работать. Любая помощь будет принята с благодарностью. Дайте мне знать, если я что-то пропустил.

0 ответов

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