Bir süre önce aynı problemle karşılaştım ve bir çözüm bulamadım. Bu cevabı, neden yapılamayacağına dair bir açıklama ile başladığımda, aslında nasıl yapılabileceğini öğrendim! :-)
Özet: UITableViewCell
özel alt sınıfı oluşturmanız gerekiyor. UILongPressGestureRecognizer
'u UITableViewCellReorderControl
'a eklemek için layoutSubviews
'u geçersiz kılın. Bir protokol tanımlayın ve sürükleme durumu hakkında istediğiniz kişileri bilgilendirmek için bir temsilci kullanın.
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
bu kodu herhangi özel API'ler kullanmaz ise Apple, iç uygulanmasını değiştirirse yine çalışması durabilir unutmayın (UITableViewCellReorderControl
sınıf adını değiştirerek).
UITableView.h arabiriminde bildirilen bu temsilci yöntemlerini göremiyorum. Onları nerede bulabileceğimizi açıklar mısın? – imnk
@mprudhom Geri aramaları aldım ancak belgesizler. Bir üretim uygulamasında bu temsilci yöntemleri var mı? Bu özel API olarak kabul edilir mi? – Torsten
Bu yöntemler gerçekten UITableView temsilcisine çağrılır. Belgelendirilmedikleri için, Apple bunları gelecekte iOS sürümlerinde ancak iOS 5 ve iOS 7 sürümlerinde kırıyor olabilir. Henüz Apple'ın bu uygulamaların App Store'da yayınlanmasına izin verilip uygulanmayacağına karar verdim (sanırım bana iyi şanslar), ama bunu yapmak için iyi bir neden olmadığını düşünüyorum: UIViewController'daki bu 3 yöntem ve bunlar belgelenmiyor ve altyazı ile başlamıyorlar ya da her neyse, kendi yöntemlerimden nasıl farklılar? – Argentumko