ฉันต้องการกดแบบยาวUITableViewCell
เพื่อพิมพ์ "เมนูการเข้าถึงด่วน" มีคนทำเช่นนี้แล้ว?
โดยเฉพาะท่าทางที่รับรู้ได้UITableView
หรือไม่
ฉันต้องการกดแบบยาวUITableViewCell
เพื่อพิมพ์ "เมนูการเข้าถึงด่วน" มีคนทำเช่นนี้แล้ว?
โดยเฉพาะท่าทางที่รับรู้ได้UITableView
หรือไม่
คำตอบ:
ขั้นแรกให้เพิ่มตัวจดจำท่าทางกดแบบยาวลงในมุมมองตาราง:
UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc]
initWithTarget:self action:@selector(handleLongPress:)];
lpgr.minimumPressDuration = 2.0; //seconds
lpgr.delegate = self;
[self.myTableView addGestureRecognizer:lpgr];
[lpgr release];
จากนั้นในตัวจัดการท่าทาง:
-(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);
}
}
คุณต้องระมัดระวังสิ่งนี้เพื่อไม่ให้ยุ่งกับการเคาะเซลล์ปกติของผู้ใช้และโปรดทราบว่าhandleLongPress
อาจทำงานได้หลายครั้ง
if (gestureRecognizer.state == UIGestureRecognizerStateBegan) ...
เช่น:
UITableView
ไม่ใช่UITableViewCell
)
ฉันใช้คำตอบของ Anna-Karenina และมันใช้งานได้ดีมากกับข้อผิดพลาดร้ายแรงมาก
หากคุณกำลังใช้ส่วนการกดหัวเรื่องเป็นเวลานานจะทำให้คุณได้ผลลัพธ์ที่ไม่ถูกต้องจากการกดแถวแรกในส่วนนั้นฉันได้เพิ่มเวอร์ชันที่แก้ไขไว้ด้านล่าง (รวมถึงการกรองการโทรหลอกที่ขึ้นอยู่กับสถานะท่าทาง) คำแนะนำของ Anna-Karenina)
- (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 (คำตอบต่อเนื่องของ Ricky ใน Swift)
เพิ่ม
UIGestureRecognizerDelegate
ไปยัง ViewController ของคุณ
override func viewDidLoad() {
super.viewDidLoad()
//Long Press
let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress))
longPressGesture.minimumPressDuration = 0.5
self.tableView.addGestureRecognizer(longPressGesture)
}
และฟังก์ชั่น:
@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)")
}
}
ต่อไปนี้เป็นคำแนะนำที่ชัดเจนซึ่งรวมคำตอบของ Dawn Song และคำตอบของ Marmor
ลากตัววางรูปแบบลายเส้นกดแบบยาวและวางลงในเซลล์ตารางของคุณ มันจะข้ามไปที่ด้านล่างของรายการทางด้านซ้าย
จากนั้นเชื่อมต่อตัวจดจำท่าทางด้วยวิธีเดียวกับที่คุณจะเชื่อมต่อปุ่ม
เพิ่มรหัสจาก Marmor ในตัวจัดการการดำเนินการ
- (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);
}
}
}
}
ดูเหมือนว่าจะมีประสิทธิภาพมากกว่าในการเพิ่มตัวจำแนกลายมือลงในเซลล์โดยตรงดังที่แสดงที่นี่:
แตะค้างไว้ที่เซลล์ TableView จากนั้นและทันที
(เลื่อนไปที่ตัวอย่างที่ด้านล่าง)
คำตอบใน Swift:
เพิ่มผู้รับมอบสิทธิ์UIGestureRecognizerDelegate
ลงใน UITableViewController ของคุณ
ภายใน 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)
}
และฟังก์ชั่น:
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)")
}
}
ฉันรวบรวมหมวดหมู่เล็ก ๆ บน UITableView ตามคำตอบที่ยอดเยี่ยมของ Anna Karenina
เช่นนี้คุณจะมีวิธีการมอบหมายที่สะดวกเหมือนที่คุณคุ้นเคยเมื่อจัดการกับมุมมองตารางปกติ ลองดูสิ:
// 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];
}
}
}
หากคุณต้องการใช้สิ่งนี้ใน UITableViewController คุณอาจต้อง subclass และสอดคล้องกับโปรโตคอลใหม่
มันใช้งานได้ดีสำหรับฉันหวังว่าจะช่วยคนอื่น ๆ !
Swift 3 คำตอบใช้ไวยากรณ์ที่ทันสมัยรวมคำตอบอื่น ๆ และกำจัดรหัสที่ไม่จำเป็น
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
}
เพียงแค่เพิ่ม UILongPressGestureRecognizer ไปยังเซลล์ต้นแบบที่กำหนดในกระดานเรื่องราวจากนั้นดึงท่าทางไปยังไฟล์. m ของ viewController เพื่อสร้างวิธีการดำเนินการ ฉันทำมันตามที่ฉันพูด
ใช้คุณสมบัติการประทับเวลาของ UITouch ใน touchesBegan เพื่อเปิดตัวจับเวลาหรือหยุดมันเมื่อ touchesEnded โดนไล่ออก