当您添加UISwipeGestureRecognizer
到您的窗口,保留对它的引用,以便您稍后可以通过AppDelegate
:
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var twoFingerSwipeDownRecognizer: UISwipeGestureRecognizer?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let twoFingerSwipeDownRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(didRecognizeTwoFingerSwipeDown))
twoFingerSwipeDownRecognizer.numberOfTouchesRequired = 2
twoFingerSwipeDownRecognizer.direction = .down
window?.addGestureRecognizer(twoFingerSwipeDownRecognizer)
self.twoFingerSwipeDownRecognizer = twoFingerSwipeDownRecognizer
return true
}
@objc func didRecognizeTwoFingerSwipeDown(recognizer: UISwipeGestureRecognizer) {
print("SWIPE DOWN")
}
}
然后,在UIViewController
其中包含UITableView
(or UIScrollView
)你必须打电话require(toFail:)
在 UITableView 的平移手势识别器上:
func enableTwoFingerSlideDown() {
guard
let appDelegate = UIApplication.shared.delegate as? AppDelegate,
let twoFingerGestureRecognizer = appDelegate.twoFingerSwipeDownRecognizer
else {
return
}
tableView.panGestureRecognizer.require(toFail: twoFingerGestureRecognizer)
}
现在,两根手指向下的手势可以在UITableView
.
UPDATE
由于滑动是一种离散手势,因此上述解决方案可能不是完美的解决方案。当您缓慢向下滚动时one用手指你会注意到UITableView
不会立即向下滚动。有一个短暂的延迟,因为UITableView's
UIPanGestureDelagate
必须等到(两根手指)SwipeDelegate 失败。这需要一些时间。
更好的解决方案可能是使用UIPanGestureRecognizer
识别两指平移,然后禁用滚动UITableView
当用户使用两根手指平移时。
可以这样实现:
在你的 AppDelegate 中:
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var twoFingerPanRecognizer: UIPanGestureRecognizer?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let twoFingerSwipeDownRecognizer = UIPanGestureRecognizer(target: self, action: #selector(didRecognizeTwoFingerPan))
twoFingerSwipeDownRecognizer.minimumNumberOfTouches = 2
twoFingerSwipeDownRecognizer.maximumNumberOfTouches = 2
twoFingerPanRecognizer?.delegate = self
window?.addGestureRecognizer(twoFingerSwipeDownRecognizer)
self.twoFingerPanRecognizer = twoFingerSwipeDownRecognizer
return true
}
@objc func didRecognizeTwoFingerPan(recognizer: UIPanGestureRecognizer) {
let tableView = recognizer.view as? UITableView
switch recognizer.state {
case .began:
tableView?.isScrollEnabled = false
case .changed:
let swipeThreshold: CGFloat = 50
switch recognizer.translation(in: nil).y {
case ...(-swipeThreshold):
print("Swipe UP")
recognizer.isEnabled = false
case swipeThreshold...:
print("Swipe DOWN")
recognizer.isEnabled = false
default:
break
}
case .cancelled, .ended, .failed, .possible:
tableView?.isScrollEnabled = true
recognizer.isEnabled = true
}
}
}
extension AppDelegate: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
}
在你的视图控制器中:
func enableTwoFingerSlideDown() {
guard
let appDelegate = UIApplication.shared.delegate as? AppDelegate,
let twoFingerGestureRecognizer = appDelegate.twoFingerPanRecognizer
else {
return
}
tableView.addGestureRecognizer(twoFingerGestureRecognizer)
}
你必须采取UIPanGestureRecognizer
来自AppDelegate
并将其添加到UITableView
。否则这行不通。只需记住将其添加回UIWindow
在这之前UIViewController
被解雇。
使用此解决方案,正常的滚动行为UITableView
保持不变。