Swift CGAffine变换旋转跳跃

时间:2018-12-23 21:35:09

标签: ios swift rotation cgaffinetransform

我在自己的项目中使用了How to rotate an UIImageView using TouchesMoved中的信息。但是我发现了一个问题,我不知道该如何解决。

原始帖子中的视图具有相同的问题,但视图较小时,几乎不会引起注意。做了这个示例代码。查看视图如何“跳跃”。接触点始终位于锚点的左侧。我如何避免这种跳跃。

class ViewController: UIViewController {
    var myView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        myView = UIView(frame: CGRect(x: 0, y: 0, width: 400, height: 200))
        myView.center = self.view.center
        myView.isUserInteractionEnabled = true
        myView.backgroundColor = UIColor.red
        self.view.addSubview(myView)
        myView.layer.anchorPoint = CGPoint(x: 0.5, y: 0.0)

    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        let touch: UITouch = touches.first!

        if touch.view === myView {
            let position = touch.location(in: self.view)
            let target = myView.center
            let angle = atan2(target.y-position.y, target.x-position.x)
            myView.transform = CGAffineTransform(rotationAngle: angle)
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您有两个主要问题:

  • 您没有考虑原始触摸的位置。您需要将该信息记录在touchesBegan中,并据此计算出旋转变换的角度。

  • 您说的let target = myView.center似乎就是我们正在讨论的重点。但这不是因为您移动了anchorPoint的{​​{1}}。

以下是工作代码(摘自我的书),您可以拖动它myView绕其中心旋转:

myView

但是,如果您确实想绕其他点旋转(像代码一样移动锚点),则需要相应地调整该代码。

答案 1 :(得分:-1)

您的问题似乎已经解决

let angle = atan2(target.y-position.y, target.x-position.x)

atan2返回0到π之间的数字,而不是所需的-π到π之间的数字。您应该可以通过将(target.y - position.y)与0进行比较来解决该问题。当它大于零时,您的原始返回值应该很好。当它小于零时,您将希望减去π以获得正确的角度。