1

私はすでに数日間、CAShapeLayer をビューに固定しようとしています。これに対する解決策が見つかりませんでした。これはフェイストラッカー プロジェクトです。eyeglassesView の固定位置に配置できる丸い CAShapeLayer を作成したいと考えています。ただし、頭を回転させるとビューのサイズが変更されるため、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
}

位置、アンカーポイント、マスクツーバウンド、変換など、さまざまなことを試しましたが、それを機能させる方法が本当にわかりません。どんな助けでも大歓迎です。不足しているものがあれば教えてください。

4

0 に答える 0