要实现在UITextView中横向触摸时触发UITapGestureRecognizer监听但是在竖向滑动时不触发UITapGestureRecognizer,您可以结合使用UIGestureRecognizerDelegate和UIScrollViewDelegate来实现。

首先,您需要将UITextView的isScrollEnabled属性设置为false,以防止滑动视图时触发手势识别事件。然后,您可以通过实现UIGestureRecognizerDelegate协议中的gestureRecognizer(_:shouldReceive:)方法来控制手势识别器是否应该接受触摸事件。在这个方法中,您可以检查手势的方向,并根据方向返回true或false,以告诉手势识别器是否应该接受该触摸事件。

接下来,您需要使用UIScrollViewDelegate协议中的scrollViewDidScroll(_:)方法来检查滚动视图的滚动方向。在这个方法中,您可以检查滚动视图的滚动方向,并将手势识别器的isEnabled属性设置为true或false,以启用或禁用手势识别器。

下面是一个示例代码,演示了如何在UITextView中实现此功能:

class MyViewController: UIViewController, UIGestureRecognizerDelegate, UIScrollViewDelegate {
@IBOutlet weak var myTextView: UITextView!
let tapGesture = UITapGestureRecognizer()

override func viewDidLoad() {
super.viewDidLoad()
// 设置tapGesture
tapGesture.delegate = self
tapGesture.addTarget(self, action: #selector(handleTap(_:)))
myTextView.addGestureRecognizer(tapGesture)
// 禁用UITextView的滚动
myTextView.isScrollEnabled = false
}

// 手势识别器委托方法
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
let velocity = touch.velocity(in: myTextView)
return abs(velocity.x) > abs(velocity.y)
}

// 滚动视图委托方法
func scrollViewDidScroll(_ scrollView: UIScrollView) {
tapGesture.isEnabled = scrollView.contentOffset.y == 0
}

// 处理tapGesture的方法
@objc func handleTap(_ gestureRecognizer: UITapGestureRecognizer) {
// 处理tapGesture事件
}
}

在上面的示例中,我们首先将UITextView的isScrollEnabled属性设置为false,以禁用滚动。然后,我们使用UIGestureRecognizerDelegate协议中的gestureRecognizer(_:shouldReceive:)方法来检查手势的方向,并根据方向返回true或false,以告诉手势识别器是否应该接受该触摸事件。

最后,我们使用UIScrollViewDelegate协议中的scrollViewDidScroll(_:)方法来检查滚动视图的滚动方向,并将手势识别器的isEnabled属性设置为true或false,以启用或禁用手势识别器。