Я столкнулся с той же проблемой некоторое время назад и не нашел решения.В то время как я начал этот ответ с объяснения, почему это не может быть сделано, я фактически узнал, как это можно сделать!: -)
Вкратце: вы должны создать пользовательский подкласс 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
).