雖然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,如果蘋果改變其內部實現它仍可能會停止工作(即通過更改UITableViewCellReorderControl
的類名)。
使用PanGesture檢測圖像拖動操作的時刻 – Bala 2012-03-19 07:57:08
感謝您的評論。已經嘗試過,沒有成功。我可以將GestureRecognizer附加到單元格的contentview,並且我的處理程序被解僱。但它不會因ReorderControl的觸發而被解僱。重寫touchesBegan也是如此... – 2012-03-19 15:51:30
發佈您的代碼可能有助於找到解決方案:) – Bala 2012-03-19 15:56:48