Drag ball over circle path in Swift

泄露秘密 提交于 2019-11-30 09:19:16

This line is wrong:

    let angle = tan(angleY/angleX)

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

    let angle = atan2(angleY, angleX)

SWIFT 3 Updated code

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.clear.cgColor
    shapeLayer.strokeColor = UIColor.red.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.blue.cgColor
    shapeLayer2.strokeColor = UIColor.clear.cgColor
    shapeLayer2.lineWidth = 7
    view.layer.addSublayer(shapeLayer2)

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

}

func dragBall(recognizer: UIPanGestureRecognizer) {
    let point = recognizer.location(in: 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 angle = atan2(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
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!