可能重复:
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
的时刻?
答案 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
的类名),它仍可能停止工作。