如何得到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