Ich stieß vor einiger Zeit auf das gleiche Problem und fand keine Lösung. Während ich diese Antwort mit einer Erklärung begann, warum es nicht möglich ist, habe ich tatsächlich herausgefunden, wie es geht! :-)
Kurz gesagt: Sie müssen eine benutzerdefinierte Unterklasse von UITableViewCell
erstellen. Überschreibe layoutSubviews
, um eine UILongPressGestureRecognizer
an UITableViewCellReorderControl
anzuhängen. Definieren Sie ein Protokoll und verwenden Sie einen Delegaten, um den Benutzer über den Ziehstatus zu informieren.
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
Beachten Sie, dass während dieser Code keine privaten APIs verwenden, ist es immer noch funktioniert möglicherweise nicht mehr, wenn Apple seine interne Implementierung ändert (zB durch Ändern des Klassennamens von UITableViewCellReorderControl
).
Ich sehe diese Delegate-Methoden nicht in der UITableView.h-Schnittstelle deklariert. Können Sie bitte erklären, wo wir sie finden können? – imnk
@mprudhom Ich habe die Rückrufe erhalten, aber sie sind nicht dokumentiert. Verfügen Sie über diese Delegatmethoden in einer Produktionsanwendung? Wird dies als private API betrachtet? – Torsten
Diese Methoden werden tatsächlich am Delegierten des UITableView aufgerufen. Da sie undokumentiert sind, könnte Apple sie in zukünftigen Versionen von iOS einfach brechen, aber von iOS 5 bis zu iOS 7 funktioniert das immer noch. Ich muss noch herausfinden, ob Apple tatsächlich eine App mit diesen implementierten Methoden erlauben würde, im App Store veröffentlicht zu werden (viel Glück für mich, denke ich), aber ich glaube nicht, dass es einen guten Grund gibt, nicht zu implementieren Diese 3 Methoden in meinem UIViewController, und sie sind nicht dokumentiert und sie beginnen nicht mit Unterstrichen oder was auch immer, wie unterscheiden sie sich von meinen eigenen Methoden? – Argentumko