如何使用 TouchesMoved 旋转 UIImageView

Posted

技术标签:

【中文标题】如何使用 TouchesMoved 旋转 UIImageView【英文标题】:How to rotate an UIImageView using TouchesMoved 【发布时间】:2014-08-09 16:06:29 【问题描述】:

我正在尝试使用触摸事件旋转UIImageView,我希望图像用我的手指旋转,我想做同样的事情:dropbox link(最好看到它,所以你明白我的意思)

在研究如何旋转 UIImageView 后:How can I rotate an UIImageView by 20 degrees。我用我开发 iPhone 应用程序的简单方法尝试了以下代码:

class ViewController: UIViewController 

    var startpoint:CGPoint!
    var endpoint:CGPoint!

    @IBOutlet var yello:UIImageView

    override func touchesMoved(touches: NSSet!, withEvent event: UIEvent!) 

        let t:UITouch = touches.anyObject() as UITouch
        startpoint = t.locationInView(self.view)
        endpoint = t.previousLocationInView(self.view)

        if t.view == yello 
            var startX = startpoint.x
            var endX = endpoint.x
            yello.center = CGPointMake(yello.center.x, yello.center.y)
            UIView.animateWithDuration(1, animations:  self.yello.transform = CGAffineTransformMakeRotation(startX-endX))
        
    

我可以清楚地看到我的代码有很多错误和不良做法,而且它的行为也不如我所愿。 (参见上面的保管箱链接)

所以也许有一个更好的方法可以通过使用 CoreAnimation 来做到这一点,如果代码示例能像我想要的那样做,我将不胜感激。

【问题讨论】:

【参考方案1】:

我刚刚写的很快。我想这就是你要找的。我没有使用图像,而是使用了彩色视图,但您可以轻松地将其替换为图像。 您可能想要检测视图是否被拖动,以便用户必须拖动视图才能旋转,因为目前用户可以拖动任何地方来旋转视图。 (下面的代码现在检查这种情况)如果您对此有任何疑问,请告诉我。

 class ViewController: UIViewController 
    var myView: UIView!
    override func viewDidLoad() 
        super.viewDidLoad()
        myView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 20))
        myView.center = self.view.center
        myView.backgroundColor = UIColor.redColor()
        self.view.addSubview(myView)
        myView.layer.anchorPoint = CGPoint(x: 1.0, y: 0.5)

        let box = UIView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
        box.backgroundColor = UIColor.blueColor()
        myView.addSubview(box)
    
    override func touchesMoved(touches: NSSet!, withEvent event: UIEvent!) 
        let touch = touches.anyObject() as UITouch
        if touch.view === myView.subviews[0] 
        let position = touch.locationInView(self.view)
        let target = myView.center
        let angle = atan2(target.y-position.y, target.x-position.x)
        myView.transform = CGAffineTransformMakeRotation(angle)
        
    

【讨论】:

atan2 将为您提供角度,并考虑到组件的符号,因此您无需计算角度所在的象限,它会为您计算。您可以在***上阅读更多关于 atan2 函数的信息:en.wikipedia.org/wiki/Atan2 是的,您将不得不扩展代码并为触摸创建一个变量。【参考方案2】:

//swift 4的更新代码

class ViewController: UIViewController 
    var myView: UIView!
    override func viewDidLoad() 
    super.viewDidLoad()
    myView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 20))
    myView.center = self.view.center
    myView.isUserInteractionEnabled = true
    myView.backgroundColor = UIColor.red
    self.view.addSubview(myView)
    myView.layer.anchorPoint = CGPoint(x: 1.0, y: 0.5)
    let box = UIView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
    box.backgroundColor = UIColor.blue
    myView.addSubview(box)



override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()


override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) 

    let touch:UITouch = touches.first!

    if touch.view === myView.subviews[0] 


        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)


    




【讨论】:

以上是关于如何使用 TouchesMoved 旋转 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章

如何以全分辨率从 UIImageView 获取旋转、缩放和平移的图像?

旋转手势产生不希望的旋转

iOS 如何使用 touchesMoved 移动两个图像?

如何在 Swift 和 SpriteKit 中使用 UISwipeGestureRecognizer 而不是 touchesMoved?

使用 TouchesMoved 跟踪两个手指

如何让 touchesMoved 只控制一个视图?