我在自己的项目中使用了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)
}
}
}
答案 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进行比较来解决该问题。当它大于零时,您的原始返回值应该很好。当它小于零时,您将希望减去π以获得正确的角度。