Yanıtlar:
İlk önce uzun basma hareketi tanıyıcıyı tablo görünümüne ekleyin:
UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc]
initWithTarget:self action:@selector(handleLongPress:)];
lpgr.minimumPressDuration = 2.0; //seconds
lpgr.delegate = self;
[self.myTableView addGestureRecognizer:lpgr];
[lpgr release];
Sonra hareket işleyicisinde:
-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
CGPoint p = [gestureRecognizer locationInView:self.myTableView];
NSIndexPath *indexPath = [self.myTableView indexPathForRowAtPoint:p];
if (indexPath == nil) {
NSLog(@"long press on table view but not on a row");
} else if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
NSLog(@"long press on table view at row %ld", indexPath.row);
} else {
NSLog(@"gestureRecognizer.state = %ld", gestureRecognizer.state);
}
}
Kullanıcının hücrenin normal dokunuşuna müdahale etmemesi ve aynı zamanda handleLongPress
birden fazla ateşlenebileceğini unutmayın (bu, hareket tanıma durumu değişikliklerinden kaynaklanacaktır) buna dikkat etmelisiniz .
if (gestureRecognizer.state == UIGestureRecognizerStateBegan) ...
.
UITableView
değil UITableViewCell
...)
Anna-Karenina'nın cevabını kullandım ve çok ciddi bir hata ile neredeyse harika çalışıyor.
Bölümler kullanıyorsanız, bölüm başlığına uzun süre basmak size bu bölümdeki ilk satıra basmanın yanlış bir sonucunu verecektir, aşağıya sabit bir sürüm ekledim (hareket durumuna göre kukla çağrıların filtrelenmesi dahil, Anna-Karenina önerisi).
- (IBAction)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
CGPoint p = [gestureRecognizer locationInView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p];
if (indexPath == nil) {
NSLog(@"long press on table view but not on a row");
} else {
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
if (cell.isHighlighted) {
NSLog(@"long press on table view at section %d row %d", indexPath.section, indexPath.row);
}
}
}
}
Swift 5'teki cevap (Ricky'nin Swift'teki cevabının devamı)
UIGestureRecognizerDelegate
ViewController'ınıza ekleyin
override func viewDidLoad() {
super.viewDidLoad()
//Long Press
let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress))
longPressGesture.minimumPressDuration = 0.5
self.tableView.addGestureRecognizer(longPressGesture)
}
Ve fonksiyon:
@objc func handleLongPress(longPressGesture: UILongPressGestureRecognizer) {
let p = longPressGesture.location(in: self.tableView)
let indexPath = self.tableView.indexPathForRow(at: p)
if indexPath == nil {
print("Long press on table view, not row.")
} else if longPressGesture.state == UIGestureRecognizer.State.began {
print("Long press on row, at \(indexPath!.row)")
}
}
İşte Dawn Song'un cevabı ile Marmor'un cevabını birleştiren net talimat.
Uzun bir Basın Hareket Tanıyıcısını sürükleyin ve Tablo Hücrenize bırakın. Soldaki listenin altına atlayacaktır.
Ardından hareket tanımlayıcıyı bir düğmeyi bağladığınız şekilde bağlayın.
Eylem işleyicisine Marmor kodunu ekleyin
- (IBAction)handleLongPress:(UILongPressGestureRecognizer *)sender {
if (sender.state == UIGestureRecognizerStateBegan) {
CGPoint p = [sender locationInView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p];
if (indexPath == nil) {
NSLog(@"long press on table view but not on a row");
} else {
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
if (cell.isHighlighted) {
NSLog(@"long press on table view at section %d row %d", indexPath.section, indexPath.row);
}
}
}
}
Tanıyıcıyı burada gösterildiği gibi doğrudan hücreye eklemek için daha verimli görünüyor:
TableView Hücreleri, Sonra ve Şimdi için Dokun ve Tut
(alttaki örneğe gidin)
Swift içinde cevap:
UIGestureRecognizerDelegate
UITableViewController'ınıza temsilci ekleyin .
UITableViewController içinde:
override func viewDidLoad() {
super.viewDidLoad()
let longPressGesture:UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: "handleLongPress:")
longPressGesture.minimumPressDuration = 1.0 // 1 second press
longPressGesture.delegate = self
self.tableView.addGestureRecognizer(longPressGesture)
}
Ve fonksiyon:
func handleLongPress(longPressGesture:UILongPressGestureRecognizer) {
let p = longPressGesture.locationInView(self.tableView)
let indexPath = self.tableView.indexPathForRowAtPoint(p)
if indexPath == nil {
print("Long press on table view, not row.")
}
else if (longPressGesture.state == UIGestureRecognizerState.Began) {
print("Long press on row, at \(indexPath!.row)")
}
}
Anna Karenina'nın mükemmel cevabına dayanarak UITableView'da küçük bir kategori oluşturdum.
Bunun gibi, normal tablo görünümleriyle uğraşırken alıştığınız gibi uygun bir temsilci yöntemine sahip olacaksınız. Bunu kontrol et:
// UITableView+LongPress.h
#import <UIKit/UIKit.h>
@protocol UITableViewDelegateLongPress;
@interface UITableView (LongPress) <UIGestureRecognizerDelegate>
@property(nonatomic,assign) id <UITableViewDelegateLongPress> delegate;
- (void)addLongPressRecognizer;
@end
@protocol UITableViewDelegateLongPress <UITableViewDelegate>
- (void)tableView:(UITableView *)tableView didRecognizeLongPressOnRowAtIndexPath:(NSIndexPath *)indexPath;
@end
// UITableView+LongPress.m
#import "UITableView+LongPress.h"
@implementation UITableView (LongPress)
@dynamic delegate;
- (void)addLongPressRecognizer {
UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc]
initWithTarget:self action:@selector(handleLongPress:)];
lpgr.minimumPressDuration = 1.2; //seconds
lpgr.delegate = self;
[self addGestureRecognizer:lpgr];
}
- (void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
CGPoint p = [gestureRecognizer locationInView:self];
NSIndexPath *indexPath = [self indexPathForRowAtPoint:p];
if (indexPath == nil) {
NSLog(@"long press on table view but not on a row");
}
else {
if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
// I am not sure why I need to cast here. But it seems to be alright.
[(id<UITableViewDelegateLongPress>)self.delegate tableView:self didRecognizeLongPressOnRowAtIndexPath:indexPath];
}
}
}
Bunu bir UITableViewController içinde kullanmak istiyorsanız, muhtemelen alt sınıfa ayırmanız ve yeni protokole uymanız gerekir.
Benim için harika çalışıyor, umarım başkalarına yardımcı olur!
Swift 3 cevap, modern sözdizimini kullanarak, diğer cevapları dahil ederek ve gereksiz kodu ortadan kaldırır.
override func viewDidLoad() {
super.viewDidLoad()
let recognizer = UILongPressGestureRecognizer(target: self, action: #selector(tablePressed))
tableView.addGestureRecognizer(recognizer)
}
@IBAction func tablePressed(_ recognizer: UILongPressGestureRecognizer) {
let point = recognizer.location(in: tableView)
guard recognizer.state == .began,
let indexPath = tableView.indexPathForRow(at: point),
let cell = tableView.cellForRow(at: indexPath),
cell.isHighlighted
else {
return
}
// TODO
}
Film şeridinde verilen prototip hücresine UILongPressGestureRecognizer'ı ekleyin, ardından bir eylem yöntemi oluşturmak için hareketi viewController'ın .m dosyasına çekin. Dediğim gibi yaptım.
UITouch zaman damgası özelliğini dokunuşlarda kullanınBir zamanlayıcı başlatmak için dokunun veya dokunulduğunda durdurun