Во-первых, если вы используете 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)")
}
Не использовать быстро, но это нормально, я могу перевести. –