Вот что я использовал в тестах:
class TouchMock: UITouch {
var y: CGFloat
init(y: CGFloat) {
self.y = y
super.init()
}
override func location(in view: UIView?) -> CGPoint {
return CGPoint(x: 10, y: y)
}
}
func sendTouchesBegan(y: CGFloat, to view: UIView) {
let touch = TouchMock(y: y)
view.touchesBegan([touch], with: nil)
}
func sendTouchesMoved(y: CGFloat, to view: UIView) {
let touch = TouchMock(y: y)
view.touchesMoved([touch], with: nil)
}
func sendTouchesEnded(y: CGFloat, to view: UIView) {
let touch = TouchMock(y: y)
view.touchesEnded([touch], with: nil)
}
func sendTouchesCancelled(y: CGFloat, to view: UIView) {
let touch = TouchMock(y: y)
view.touchesCancelled([touch], with: nil)
}
Важно: для меня была интересна только Y-координата. Добавление X-координаты, конечно, тривиально.