2015-02-16 2 views

ответ

1

Во-первых, если вы используете Swift, вы будете нуждаться, чтобы создать Bridging заголовка и #import <UIKit/UIGestureRecognizerSubclass.h>, так что вы можете переопределить начало/перемещаемые/отмененные/завершившиеся методы UIGestureRegoniser «s прикосновений. Если вы используете Objective-C, просто поставьте этот оператор import в файл .h или .m.

Во-вторых, как только вы создали свой UIGestureRecogniser подкласс вам нужны эти переменные в нем:

ссылка
private lazy var displayLink: CADisplayLink = { 
    let link = CADisplayLink(target: self, selector: Selector("timerCalled")) 
    link.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes) 
    return link 
}() 

private var previousTouchLocation: CGPoint? 
private var currentTouchLocation : CGPoint? 

private var previousTime: Double? 
private var currentTime : Double? 

Дисплей для обновления currentTime и previousTime.

В-третьих,, чтобы продолжить настройку все вверх необходимо переопределить следующие методы, я думаю, что все это говорит само за себя:

override func touchesBegan(touches: Set<NSObject>!, withEvent event: UIEvent!) { 
    self.state = .Began 
    displayLink.paused = false 
} 

override func touchesMoved(touches: Set<NSObject>!, withEvent event: UIEvent!) { 
    if let view = self.view, 
     touch = touches.first as? UITouch { 
     self.state = .Changed 

     let newLocation = touch.locationInView(view) 
     self.previousTouchLocation = self.currentTouchLocation 
     self.currentTouchLocation = newLocation 
    } 
} 

override func touchesEnded(touches: Set<NSObject>!, withEvent event: UIEvent!) { 
    self.state = .Ended 
    displayLink.paused = true 
} 

override func touchesCancelled(touches: Set<NSObject>!, withEvent event: UIEvent!) { 
    self.state = .Cancelled 
    displayLink.paused = true 
} 

В-четвертых, теперь мы можем получить к более интересному бит - расчета скорости:

func velocityInView(targetView: UIView) -> CGPoint { 
    var velocity = CGPoint.zeroPoint 

    if let view = self.view, 
     prevTouchLocation = self.previousTouchLocation, 
     currTouchLocation = self.currentTouchLocation, 
     previousTime = self.previousTime, 
     currentTime = self.currentTime { 

     let targetPrevLocation = view.convertPoint(prevTouchLocation, toView: targetView) 
     let targetCurrLocation = view.convertPoint(currTouchLocation, toView: targetView) 

     let deltaTime = CGFloat(currentTime - previousTime) 

     let velocityX = (targetCurrLocation.x - targetPrevLocation.x)/deltaTime 
     let velocityY = (targetCurrLocation.y - targetPrevLocation.y)/deltaTime 

     velocity = CGPoint(x: velocityX, y: velocityY) 
    } 

    return velocity 
} 

скорость вычисляется с помощью уравнения:

velocity = deltaDistance/deltaTime 

В этом случае возьмите каждую составляющую скорости (x и y) и используйте это уравнение для вычисления скорости по каждой оси. Если вы хотите, чтобы объединить обе компоненты скорости вы должны использовать теорему Пифагора следующим образом:

let distance = hypot(targetCurrLocation.x - targetPrevLocation.x, 
        targetCurrLocation.y - targetPrevLocation.y) 
let velocity = distance/deltaTime 

В-пятых, в контроллере представления, теперь вы можете добавить свой жест распознавани и использовать action, чтобы получить скорость при перемещении над экраном:

override func viewDidLoad() { 
    super.viewDidLoad() 

    let recogniser = VelocityGestureRecogniser(target: self, action: Selector("movedGesture:")) 
    self.view.addGestureRecognizer(recogniser) 
} 

func movedGesture(recogniser: VelocityGestureRecogniser) { 
    let v = recogniser.velocityInView(self.view) 
    println("velocity = \(v)") 
} 
+0

Не использовать быстро, но это нормально, я могу перевести. –

Смежные вопросы