Frage

Ich möchte einen langen Druck auf einem UITableViewCell zu handhaben einen „schnellen Zugriff Menü“ zu drucken. Hat jemand dies bereits tun?

Besonders erkennt die Geste auf UITableView?

War es hilfreich?

Lösung

Zuerst den lange drücken Gestenerkenner an die Tabellenansicht hinzuzufügen:

UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] 
  initWithTarget:self action:@selector(handleLongPress:)];
lpgr.minimumPressDuration = 2.0; //seconds
lpgr.delegate = self;
[self.myTableView addGestureRecognizer:lpgr];
[lpgr release];

Dann in der Geste Handler:

-(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);
    }
}

Sie haben damit vorsichtig sein, so dass es nicht mit dem Benutzer normalen Abhören der Zelle nicht stört und auch, dass handleLongPress beachten Sie kann mehrmals feuern (dies aufgrund der Gestenerkenner Zustandsänderungen werden).

Andere Tipps

Ich habe verwendet Anna-Karenina Antwort, und es funktioniert fast groß mit einem sehr ernsten Fehler.

Wenn Sie Abschnitte verwenden, langes Drücken der Überschrift Sie ein falsches Ergebnis liefern wird auf diesem Abschnitt die erste Reihe zu drücken, ich habe eine feste Version unten (einschließlich der Filterung von Dummy-Anrufe hinzugefügt, basierend auf der Geste Zustand, pro Anna-Karenina Vorschlag).

- (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);
            }
        }
    }
}

kombinieren Hier geklärt Anweisung Dawn Song Antwort und Marmor Antwort.

Ziehen Sie einen langen Drücken Gestenerkenner und in Ihre Tabellenzelle fallen. Es wird auf der linken Seite nach unten in der Liste springen.

 image description hier

eingeben

Schließen Sie dann die Gestenerkenner die gleiche Art und Weise Sie auf eine Schaltfläche in Verbindung bringen würde. eingeben Bild Beschreibung hier

Fügen Sie den Code aus Marmor in dem die Aktionshandler

- (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);
        }
    }
}

}

Antwort in Swift 5 (Fortsetzung der Antwort Ricky in Swift)

  

Fügen Sie den UIGestureRecognizerDelegate zu Ihrem Viewcontroller

 override func viewDidLoad() {
    super.viewDidLoad()

    //Long Press
    let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress))
    longPressGesture.minimumPressDuration = 0.5
    longPressGesture.delegate = self
    self.tableView.addGestureRecognizer(longPressGesture)
 }
  

Und die Funktion:

@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)")
    }
}

Sieht aus effizienter werden die Erkennungs direkt auf die Zelle hinzufügen, wie hier gezeigt:

Tap & Hold für Tableview Zellen, dann und nun

(Blättern zum Beispiel an der Unterseite)

Antwort in Swift:

Fügen Sie delegieren UIGestureRecognizerDelegate zu Ihrem UITableViewController.

Innerhalb UITableViewController:

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)

}

Und die Funktion:

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)")
    }

}

Ich habe eine kleine Kategorie auf UITableView basierend auf Anna Karenina ausgezeichnete Antwort.

Wie das Sie eine bequeme Delegatmethode haben werden wie Sie es gewohnt sind, wenn sie mit regelmäßigen Tabellenansichten zu tun. Check it out:

//  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];
        }
    }
}

Wenn Sie dies in einem UITableViewController verwenden möchten, haben Sie wahrscheinlich zu Unterklasse müssen und auf das neue Protokoll entsprechen.

Es funktioniert großartig für mich, hoffe, es hilft anderen!

Swift 3 Antwort, mit moderner Syntax, andere Antworten enthält, und nicht benötigten Code beseitigt wird.

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
}

Just UILongPressGestureRecognizer der gegebenen Prototyp Zelle in Storyboard hinzufügen, ziehen Sie dann die Geste auf den .m-Datei des Viewcontroller eine Aktionsmethode zu erstellen. Ich habe es wie gesagt.

Mit der UITouch Zeitstempel Eigenschaft in touchesBegan einen Timer zu starten oder stoppen, wenn touchesEnded gefeuert wurde

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top