检测UITableViewCell的拖动事件

时间:2012-03-18 16:35:26

标签: iphone ios uitableview drag-and-drop

  

可能重复:
  How to get notified of UITableViewCell move start and end

我已经使用自定义设计实现了UITableView。此UITableView必须支持编辑模式。进入编辑模式时,UITableViewCell会被其他控件(EditControl,ReorderControl ...)修饰。它们不适合我的自定义设计,这就是我想要替换它们的图像的原因。为此,我将UITableViewCell子类化并覆盖layoutSubview,在那里我替换了这些控件的图像。

问题:开始拖拽时drop操作,EditControl的图像被替换回UITableViewCell中的原始图像。我可以在

中再次替换它
– tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:

当用户将可拖动单元格移动到另一个indexPath时,但为时已晚。

所以我的问题归结为:如何检测用户实际开始拖动UITableViewCell的时刻?

1 个答案:

答案 0 :(得分:0)

虽然Bala的评论指向了正确的方向,但我最初在正确的实施方面遇到了一些问题。现在我发现了它是如何完成的。简而言之:您必须创建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

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