如何得到UITableViewCell移动开始和结束的通知

我的iOS应用程序中有一个UITableView定期刷新。 用户也可以随时移动tableview行(tableview始终处于编辑模式)。

我想停止刷新计时器,当用户开始拖动一行,并在行被删除时再次启动它。

使用moveRowAtIndexPath最后一部分应该很容易,但是如何获得有关拖动启动的通知?

谢谢!

您的UITableViewDelegate将收到以下通知以响应重新sorting操作:

 - (void)tableView:(UITableView *)tableView willBeginReorderingRowAtIndexPath:(NSIndexPath *)indexPath; - (void)tableView:(UITableView *)tableView didEndReorderingRowAtIndexPath:(NSIndexPath *)indexPath; - (void)tableView:(UITableView *)tableView didCancelReorderingRowAtIndexPath:(NSIndexPath *)indexPath; 

我前段时间遇到同样的问题,没有find解决办法。 当我开始解释为什么不能完成这个答案时,我发现它是如何做到的! 🙂

简而言之:您必须创build一个UITableViewCell的自定义子类。 覆盖layoutSubviews以将UILongPressGestureRecognizer附加到UITableViewCellReorderControl 。 定义一个协议,并使用一个委托通知谁想要关于拖动状态。

CustomTableViewCell.h:

 #import <UIKit/UIKit.h> @protocol CustomTableViewCellDelegate; @interface CustomTableViewCell : UITableViewCell { } @property (nonatomic, assign) id <CustomTableViewCellDelegate> delegate; @end @protocol CustomTableViewCellDelegate - (void)CustomTableViewCell:(CustomTableViewCell *)cell isDragging:(BOOL)value; @end 

CustomTableViewCell.m:

 #import "CustomTableViewCell.h" @implementation CustomTableViewCell @synthesize delegate = _delegate; - (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer { if (gestureRecognizer.state == UIGestureRecognizerStateBegan) { [_delegate CustomTableViewCell:self isDragging:YES]; // Dragging started } else if (gestureRecognizer.state == UIGestureRecognizerStateEnded) { [_delegate CustomTableViewCell:self isDragging:NO]; // Dragging ended } } - (void)layoutSubviews { [super layoutSubviews]; for (UIView *view in self.subviews) { if ([NSStringFromClass ([view class]) rangeOfString:@"ReorderControl"].location != NSNotFound) { // UITableViewCellReorderControl if (view.gestureRecognizers.count == 0) { UILongPressGestureRecognizer *gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; gesture.cancelsTouchesInView = NO; gesture.minimumPressDuration = 0.150; [view addGestureRecognizer:gesture]; } } } } @end 

请注意,尽pipe此代码不使用任何私有API,但如果Apple更改其内部实现(即通过更改UITableViewCellReorderControl的类名),它仍可能停止工作。

只是我发现了一个黑客,因为苹果将减less阿尔法,我们可以使用,我猜

 @interface CustomTableViewCell () @property (nonatomic, assign) BOOL isDragging; @end -(void)draggingWillBegan { //use a delegate method to inform tableview } -(void)draggingDidEnd { //use a delegate method to inform tableview } - (void)layoutSubviews { [super layoutSubviews]; //Since apple wont provide en if(self.alpha <= 0.95 && !self.isDragging){ self.isDragging = YES; [self draggingWillBegan]; } if(self.alpha >= 0.95 && self.isDragging){ self.isDragging = NO; [self draggingDidEnd]; } } 

这个方法在你完成移动单元格时被调用:

 - (void) tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath