2016-04-02 26 views
7

Tôi có chế độ xem hình vòng tròn và xoay vòng qua mã sau ghi đè touchesBegan(touches:, withEvent:)touchesMoved(touches:, withEvent:).Tính tốc độ quay và xoay vòng tự nhiên iOS

var deltaAngle = CGFloat(0) 
var startTransform: CGAffineTransform? 

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) 
{ 
    let touchPoint = touches.first!.locationInView(view) 

    let dx = touchPoint.x - view.center.x 
    let dy = touchPoint.y - view.center.y 

    deltaAngle = atan2(dy, dx) 
    startTransform = arrowPickerView.transform 
} 

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) 
{ 
    let touchPoint = touches.first!.locationInView(view) 

    let dx = touchPoint.x - view.center.x 
    let dy = touchPoint.y - view.center.y 
    let angle = atan2(dy, dx) 
    let angleDifference = deltaAngle - angle 
    let transform = CGAffineTransformRotate(startTransform!, -angleDifference) 
    arrowPickerView.transform = transform 
} 

Tôi muốn ghi đè touchesEnded(touches:, withEvent:) để tính toán vận tốc và có chế độ xem tự động xoay một chút (tương tự như cuộn liên tục). Tôi hiện đang lưu biến đổi ban đầu và tính toán góc delta. Làm thế nào tôi có thể thực hiện điều này? Cảm ơn trước!

+1

Vận tốc là khoảng cách chia cho thời gian vì vậy nếu bạn thêm một NSDate(). Timesince1970 trong touches của bạnBegan và trong chạm của bạnEnd bạn có thể tính toán sự khác biệt trong vài giây giữa sự kiện bắt đầu và kết thúc sự kiện. Khoảng cách chỉ là sqrt (dx^2 + dy^2). Hay đó không phải là vận tốc bạn đang tìm kiếm? Khác bị bệnh viết lại như là một câu trả lời dưới đây :) – Emptyless

+0

Tôi đã tìm kiếm chỉ để xử lý di động cuộn để có nó tiếp tục di chuyển. Nếu người dùng nói di chuyển siêu nhanh và sau đó thực sự chậm và cho phép đi thì nó sẽ tiếp tục quay với tốc độ nhanh hơn tốc độ cuối cùng mà nó quay. Tôi đặt trọng tâm vào vận tốc trong câu hỏi, nhưng đó là tất cả về di chuyển động –

Trả lời

2

Trong ví dụ của tôi dưới đây, các CGAffineTransformRotate phụ thuộc vào:

  • hướng (nếu người dùng di chuyển từ trái sang phải, lên hoặc xuống vv)
  • xoay (một yếu tố phụ thuộc vào thời gian giữa touchesBegan và touchesEnded)
  • PI

này tạo ra một CGAffineTransformRotate và điều này quay với thời gian 1 (s), để tạo ra một cảm giác của động di chuyển các UIViewAnimationOpt tài sản được sử dụng ions.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) 

} 

tôi đã thêm các biến để theo dõi các sự bắt đầu và kết thúc thời điểm chạm và thêm vị trí CGPoint của hàm touchesBegan

var dateTouchesStarted : NSDate? 
var dateTouchesEnded : NSDate? 
var touchPointStart : CGPoint? 

Trong touchesBegan tôi nói thêm:

self.touchPointStart = touchPoint 

Để đặt biến như được giải thích ở trên.

+1

Tôi đã phải tinh chỉnh nó để làm cho nó hoạt động cho tình hình của tôi, nhưng cảm ơn! Bạn nhận được tiền thưởng! –

Các vấn đề liên quan