gpt4 book ai didi

ios - 如何使用 RxSwift 检测双击

转载 作者:行者123 更新时间:2023-11-30 10:24:10 26 4
gpt4 key购买 nike

我正在尝试使用 RxSwift 检测双击

如果没有 RxSwift,我会是这样的:

private func setupFakePanView() {
let singleTapGesture = UITapGestureRecognizer()
let doubleTapGesture = UITapGestureRecognizer()

singleTapGesture.numberOfTapsRequired = 1
doubleTapGesture.numberOfTapsRequired = 2

singleTapGesture.addTarget(self, action: #selector(self.tapped))
doubleTapGesture.addTarget(self, action: #selector(self.doubleTapped))

someView.addGestureRecognizer(singleTapGesture)
someView.addGestureRecognizer(doubleTapGesture)

singleTapGesture.require(toFail: doubleTapGesture)
}

@objc private func tapped() {
// Do something
}

@objc private func doubleTapped() {
// Do something else
}

有没有办法可以使用 RxSwift、RxCocoa 和 RxGesture 实现相同的效果?我已经尝试过以下方法,但当然不起作用:

someView.rx
.tapGesture(numberOfTouchesRequired: 1, numberOfTapsRequired: 1)
.when(.recognized)
.subscribe(onNext: { _ in
// Do something
})
.disposed(by: bag)

someView.rx
.tapGesture(numberOfTouchesRequired: 1, numberOfTapsRequired: 2)
.when(.recognized)
.subscribe(onNext: { _ in
// Do something else
})
.disposed(by: bag)

有没有办法让第一个 tapGesture 知道第二个一定会失败?

最佳答案

我找到了两个解决方案来解决这个问题!

A.使用自定义 UITapGestureRecognizer

let doubleTapGesture = UITapGestureRecognizer()
doubleTapGesture.numberOfTapsRequired = 2

let singleTapGesture = UITapGestureRecognizer()
singleTapGesture.numberOfTapsRequired = 1
singleTapGesture.require(toFail: doubleTapGesture)

let singleTap = someView.rx
.gesture(singleTapGesture)
.when(.recognized)
.subscribe(onNext: { _ in
// Do something
})
.disposed(by: bag)


let doubleTap = someView.rx
.gesture(doubleTapGesture)
.when(.recognized)
.subscribe(onNext: { _ in
// Do something else
})
.disposed(by: bag)

或者..

B。使用自定义 UIGestureRecognizerDelegate

谢谢Kishan建议Jegnux's answer !

1 - 为单击手势设置自定义委托(delegate)...

someView.rx
.tapGesture(
numberOfTouchesRequired: 1,
numberOfTapsRequired: 1,
configuration: { [weak self] gesture, delegate in
gesture.delegate = self
}
)
.subscribe(onNext: { _ in
// Do something
})
.disposed(by: bag)

// double tap same as before

2 - 实现 gestureRecognizer(_:shouldRequireFailureOf:)

extension MyController: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
if let gesture = otherGestureRecognizer as? UITapGestureRecognizer, gesture.numberOfTapsRequired == 2 {
return true
}
return false
}
}

两种解决方案都工作正常。

关于ios - 如何使用 RxSwift 检测双击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60168873/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com