本文介绍了在Swift中将球拖过圆形路径的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我做了一个圆圈路径,圆圈路径的中心位于视图的中间。然后,我做了一个只能在圆形路径上移动的球(至少这是我想要的):

I made a circle Path, the center of the circle path is in the middle of the view. Then, I made a ball that can move only on the circle path (at least this is what I want it to be):

我做了一个函数,无论我在哪里拖动它都会移动球(仅限于圆圈路径),但出于某种原因,每当我拖动它时,它都会变得疯狂并且不会移动,因为我希望它移动。

I made a function that move the ball wherever I drag him (on the circle path only), but for some reason whenever I drag it, it gets crazy and doesn't move as I want it to move.

这是我到目前为止的代码:

This is my code so far:

class ViewController: UIViewController {
    var midViewX = CGFloat()
    var midViewY = CGFloat()

    var circlePath2 = UIBezierPath()
    var shapeLayer2 = CAShapeLayer()
    override func viewDidLoad() {
        super.viewDidLoad()
        midViewX = view.frame.midX
        midViewY = view.frame.midY
        // Do any additional setup after loading the view, typically from a nib.
        let circlePath = UIBezierPath(arcCenter: CGPoint(x: midViewX,y: midViewY), radius: CGFloat(100), startAngle: CGFloat(0), endAngle:CGFloat(M_PI * 2), clockwise: true)
        let shapeLayer = CAShapeLayer()
        shapeLayer.path = circlePath.CGPath
        shapeLayer.fillColor = UIColor.clearColor().CGColor
        shapeLayer.strokeColor = UIColor.redColor().CGColor
        shapeLayer.lineWidth = 3.0
        view.layer.addSublayer(shapeLayer)

        var angleEarth: Double = 180
        var angleEarthAfterCalculate: CGFloat = CGFloat(angleEarth*M_PI/180) - CGFloat(M_PI/2)
        var earthX = midViewX + cos(angleEarthAfterCalculate)*100
        var earthY = midViewY + sin(angleEarthAfterCalculate)*100
        circlePath2 = UIBezierPath(arcCenter: CGPoint(x: earthX,y: earthY), radius: CGFloat(10), startAngle: CGFloat(0), endAngle:CGFloat(M_PI * 2), clockwise: true)
        shapeLayer2.path = circlePath2.CGPath
        shapeLayer2.fillColor = UIColor.blueColor().CGColor
        shapeLayer2.strokeColor = UIColor.clearColor().CGColor
        shapeLayer2.lineWidth = 7
        view.layer.addSublayer(shapeLayer2)

        let dragBall = UIPanGestureRecognizer(target: self, action:#selector(ViewController.dragBall(_:)))
        view.addGestureRecognizer(dragBall)

    }

    @IBAction func dragBall(recognizer: UIPanGestureRecognizer) {
        let point = recognizer.locationInView(self.view);
        let earthX = Double(point.x)
        let earthY = Double(point.y)
        let midViewXDouble = Double(midViewX)
        let midViewYDouble = Double(midViewY)
        let angleX = (earthX - midViewXDouble)
        let angleY = (earthY - midViewYDouble)
        let angle = tan(angleY/angleX)
        let earthX2 = midViewXDouble + cos(angle)*100
        let earthY2 = midViewYDouble + sin(angle)*100
        circlePath2 = UIBezierPath(arcCenter: CGPoint(x: earthX2,y: earthY2), radius: CGFloat(10), startAngle: CGFloat(0), endAngle:CGFloat(M_PI * 2), clockwise: true)
        shapeLayer2.path = circlePath2.CGPath
    }
}

解决方案可能是我在拖动 Func

The solution is probably in the math I made in the dragBall Func

推荐答案

这一行错了:

    let angle = tan(angleY/angleX)

因为你想要计算从您需要的坐标开始角度

Since you want to calculate the angle from the coordinates you needthe "inverse tangent of two variables"

    let angle = atan2(angleY, angleX)

这篇关于在Swift中将球拖过圆形路径的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-22 18:08
查看更多