我正在尝试在我的UITableViewController中实现一个UIPanGestureRecognizer,用于滑动以删除动画.与清除应用程序中使用的滑动删除类似,如果您向左或向右滑动UITableViewCell,则单元格会移动并被删除.
我已经尝试在我的UITableViewCell子类中实现它,但它似乎永远不会收到该事件.
这是我在UITableViewCell子类中放置的代码,用于尝试此功能.在我的init方法中
UIGestureRecognizer *recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; recognizer.delegate = self; [self addGestureRecognizer:recognizer];
然后处理它的方法:
- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer { CGPoint translation = [gestureRecognizer translationInView:self.superview]; //might have to change view to tableView //check for the horizontal gesture if (fabsf(translation.x) > fabsf(translation.y)) { return YES; NSLog(@"Panning"); } return NO; } - (void)handlePan:(UIPanGestureRecognizer *)recognizer { if (recognizer.state == UIGestureRecognizerStateBegan) { //if the gesture has just started record the center location NSLog(@"handlePan"); _originalCenter = self.center; //Declared as a CGPoint at the top of my TableViewCell } if (recognizer.state == UIGestureRecognizerStateChanged) { //translate the center (aka translate from the center of the cell) CGPoint translation = [recognizer translationInView:self]; self.center = CGPointMake(_originalCenter.x + translation.x,_originalCenter.y); // determine whether the item has been dragged far enough to delete/complete } if (recognizer.state == UIGestureRecognizerStateEnded) { // the frame this cell would have had before being dragged CGRect originalFrame = CGRectMake(0,self.frame.origin.y,self.bounds.origin.x,self.bounds.size.height); [UIView animateWithDuration:0.2 animations:^{ self.frame = originalFrame;} ]; } }
但是,细胞根本不会移动.不确定这里发生了什么
解决方法
如果您不希望单元格的滑动手势与表格视图滚动手势同时发生,则向您的单元格添加平移手势并使其成为委托:
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(doPan:)]; pan.delegate = self; [self addGestureRecognizer:pan];
并实现以下委托方法,仅在平移为水平时启动:
#pragma mark - UIGestureRecognizerDelegate - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { // note: we might be called from an internal UITableViewCell long press gesture if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) { UIPanGestureRecognizer *panGestureRecognizer = (UIPanGestureRecognizer*)gestureRecognizer; UIView *cell = [panGestureRecognizer view]; CGPoint translation = [panGestureRecognizer translationInView:[cell superview]]; // Check for horizontal gesture if (fabs(translation.x) > fabs(translation.y)) { return YES; } } return NO; }
Swift3 ..
override func awakeFromNib() { super.awakeFromNib() // do not use,say,layoutSubviews as layoutSubviews is called often let p = UIPanGestureRecognizer(target: self,action: #selector(yourPan)) p.delegate = self contentView.addGestureRecognizer(p) } } override func gestureRecognizerShouldBegin(_ g: UIGestureRecognizer) -> Bool { if (g.isKind(of: UIPanGestureRecognizer.self)) { let t = (g as! UIPanGestureRecognizer).translation(in: contentView) let verticalness = abs(t.y) if (verticalness > 0) { print("ignore vertical motion in the pan ...") print("the event engine will >pass on the gesture< to the scroll view") return false } } return true }