[英]Swift: How to detect when pan gesture is dismissed / cancelled?
我有一个可滑动的自定义表格单元。 我正在使用此库继承自: https : //github.com/alikaragoz/MCSwipeTableViewCell
为了防止同时擦除2个单元格,我有一个全局布尔值,当某件事被擦除时,我只切换true / false
。
但是,当用户开始滑动但放开时,我找不到任何回调,这实际上取消了滑动。 有没有办法做到这一点? 我正在寻找类似于gestureRecognizerShouldBegin
的回调,但是当手势被取消/取消时。
typealias SwipeHandler = () -> ()
class OrderCellManager {
static var swiping = false
}
class OrderPreparingTableViewCell: MCSwipeTableViewCell {
override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
if (!OrderCellManager.swiping) {
OrderCellManager.swiping = true
return true
} else {
return false
}
}
func displayOrder(order: AppState.Order, clock: Clock, fDone: @escaping SwipeHandler, fDelete: @escaping SwipeHandler) -> OrderPreparingTableViewCell {
..
self.setSwipeGestureWith(lSwipe, color: Config.ColorSwipeDelete, mode: .exit, state: .state1, completionBlock:currySwipe(f: fDelete))
self.setSwipeGestureWith(rSwipe, color: Config.ColorSwipeDone, mode: .exit, state: .state3, completionBlock:currySwipe(f: fDone))
..
}
// MARK: Private
private func currySwipe(f: @escaping SwipeHandler) -> MCSwipeCompletionBlock {
return { (a: MCSwipeTableViewCell?, b: MCSwipeTableViewCellState, c: MCSwipeTableViewCellMode) -> () in
OrderCellManager.swiping = false
f()
}
}
}
func pan(gesture: UIPanGestureRecognizer) {
switch gesture.state {
case .changed: fallthrough
case .ended:
// update anything that depends on the pan gesture using translation.x and .y
case .cancelled:
//do your thing here
default: break
}
}
在您的viewDidLoad方法中添加此代码
self.addGestureRecognizer(UIPanGestureRecognizer(
target: view,action:#selector(MCSwipeTableViewCell.pan(gesture:))
))
可能是这样的:
if gesture.state == UIGestureRecognizerState.Ended { //code }
我最终做到了这一点,可以通过我正在使用的表格单元格窗格来使用:
class OrderTableManager {
static var swiping = false
}
class OrderPreparingTableViewCell: MCSwipeTableViewCell, MCSwipeTableViewCellDelegate {
override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
if !OrderTableManager.swiping {
OrderTableManager.swiping = true
return true
} else {
return false
}
}
// MARK: Public
func swipeTableViewCellDidEndSwiping(_ cell: MCSwipeTableViewCell!) {
OrderTableManager.swiping = false
}
func displayOrder(order: AppState.Order, clock: Clock, fDone: @escaping SwipeHandler, fDelete: @escaping SwipeHandler) -> OrderPreparingTableViewCell {
...
self.delegate = self
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.