Ho incontrato lo stesso problema qualche tempo fa e non ho trovato una soluzione. Mentre ho iniziato questa risposta con una spiegazione del perché non può essere fatto, in realtà ho scoperto come si può fare! :-)
In breve: è necessario creare una sottoclasse personalizzata di UITableViewCell
. Sostituire layoutSubviews
per allegare un UILongPressGestureRecognizer
a UITableViewCellReorderControl
. Definire un protocollo e utilizzare un delegato per informare chiunque desideri dello stato di trascinamento.
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
essere consapevoli del fatto che, mentre questo codice non utilizza alcun API private ancora potrebbe smettere di funzionare se Apple cambia la sua implementazione interna (cioè cambiando il nome della classe di UITableViewCellReorderControl
).
fonte
2012-03-28 01:08:42
Non vedo questi metodi delegati dichiarati nell'interfaccia UITableView.h. Puoi spiegare dove possiamo trovarli? – imnk
@mprudhom Ho ricevuto i callback ma non sono documentati. Avete questi metodi delegati in un'app di produzione? Questa è considerata API privata? – Torsten
Questi metodi sono effettivamente chiamati su delegato di UITableView. Poiché non sono documentati, Apple potrebbe semplicemente romperli nelle versioni future di iOS, ma da iOS 5 e fino a iOS 7, funziona ancora. Devo ancora scoprire se Apple consentirà effettivamente a un'App con questi metodi implementati di essere pubblicati su App Store (buona fortuna a me, immagino), ma non credo ci sia un buon motivo per non farlo: se implemento questi 3 metodi nel mio UIViewController, e non sono documentati e non iniziano con underscore o quant'altro, come sono diversi dai miei metodi? – Argentumko