Ios 计算旋转速度并自然旋转视图

Ios 计算旋转速度并自然旋转视图,ios,swift,transform,trigonometry,touch-event,Ios,Swift,Transform,Trigonometry,Touch Event,我有一个圆形视图,它通过以下代码进行旋转:覆盖触摸开始(触摸:,withEvent:)和触摸移动(触摸:,withEvent:) var deltaAngle=CGFloat(0) var startTransform:CGAffineTransform? 覆盖功能触摸开始(触摸:设置,withEvent事件:UIEvent?) { 让touchPoint=touchs.first!.locationInView(视图) 设dx=touchPoint.x-view.center.x 设dy=to

我有一个圆形视图,它通过以下代码进行旋转:覆盖触摸开始(触摸:,withEvent:)和触摸移动(触摸:,withEvent:)

var deltaAngle=CGFloat(0)
var startTransform:CGAffineTransform?
覆盖功能触摸开始(触摸:设置,withEvent事件:UIEvent?)
{
让touchPoint=touchs.first!.locationInView(视图)
设dx=touchPoint.x-view.center.x
设dy=touchPoint.y-view.center.y
三角洲角=atan2(dy,dx)
startTransform=arrowPickerView.transform
}
覆盖功能触摸移动(触摸:设置,带事件:UIEvent?)
{
让touchPoint=touchs.first!.locationInView(视图)
设dx=touchPoint.x-view.center.x
设dy=touchPoint.y-view.center.y
让角度=atan2(dy,dx)
让角度差=三角洲角度-角度
让变换=CGAffineTransformRotate(开始变换!,-角度差)
arrowPickerView.transform=transform
}

我想覆盖
touchesend(touchs:,withEvent:)
来计算速度,让视图自然地旋转一点(类似于连续滚动)。我当前保存原始变换并计算三角形角度。我如何实现这一点?提前谢谢

在下面的示例中,CGAffineTransformRotate取决于:

  • 方向(如果用户从左向右、向上或向下移动等)
  • 旋转(取决于触摸开始和触摸结束之间的时间的系数)
  • 圆周率
这将创建CGAffineTransformRotate,并以持续时间1(s)旋转,以创建动态滚动的感觉。使用UIViewAnimationOptions.CurveEaseOut属性

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {

    let touchPointEnd = touches.first!.locationInView(view)

    self.dateTouchesEnded = NSDate()

    let delay : NSTimeInterval = NSTimeInterval(0)

    let timeDelta : Double = self.dateTouchesEnded!.timeIntervalSince1970 - self.dateTouchesStarted!.timeIntervalSince1970

    let horizontalDistance : Double = Double(touchPointEnd.x - self.touchPointStart!.x)
    let verticalDistance : Double = Double(touchPointEnd.y - self.touchPointStart!.y)

    var direction : Double = 1
    if (fabs(horizontalDistance) > fabs(verticalDistance)) {
        if horizontalDistance > 0 {
            direction = -1
        }
    } else {
        if verticalDistance < 0 {
            direction = -1
        }
    }

    let rotation : Double = (0.1 / timeDelta < 0.99) ? 0.1 / timeDelta : 0.99

    let duration : NSTimeInterval = NSTimeInterval(1)
    UIView.animateWithDuration(duration, delay: delay, options: UIViewAnimationOptions.CurveEaseOut, animations: {
        let transform = CGAffineTransformRotate(self.imageView.transform, CGFloat(direction) * CGFloat(rotation) * CGFloat(M_PI))
        self.imageView.transform = transform
        }, completion: nil)

}
在TouchesStart中,我补充道:

self.touchPointStart = touchPoint

如上所述设置变量

速度是距离除以时间,因此如果在touchsbegind和touchsend中添加NSDate().timesince1970,则可以计算开始事件和结束事件之间的秒差。距离正好是sqrt(dx^2+dy^2)。或者这不是你想要的速度?否则,我将重写以下答案:)我只是想处理动态滚动,让它继续滚动。如果用户说滚动非常快,然后非常慢,然后放开,那么它将继续以比上次旋转时更快的速度旋转。我在问题中强调了速度,但这都是关于动态滚动的,我不得不调整它,使其适合我的情况,但谢谢!你得到赏金了!太棒了,我在找一些东西,但你需要更新swift 5的答案
var dateTouchesStarted : NSDate?
var dateTouchesEnded : NSDate?
var touchPointStart : CGPoint?
self.touchPointStart = touchPoint