UILongPressGestureRecognizer จะถูกเรียกสองครั้งเมื่อกดลง


359

ฉันกำลังตรวจสอบว่าผู้ใช้กดลงไป 2 วินาทีหรือไม่:

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
                                             initWithTarget:self 
                                             action:@selector(handleLongPress:)];
        longPress.minimumPressDuration = 2.0;
        [self addGestureRecognizer:longPress];
        [longPress release];

นี่คือวิธีจัดการกดแบบยาว:

-(void)handleLongPress:(UILongPressGestureRecognizer*)recognizer{
    NSLog(@"double oo");
}

ข้อความ "double oo" ถูกพิมพ์สองครั้งเมื่อฉันกดลงนานกว่า 2 วินาที ทำไมนี้ ฉันจะแก้ไขได้อย่างไร

คำตอบ:


684

UILongPressGestureRecognizer เป็นตัวจำแนกเหตุการณ์อย่างต่อเนื่อง คุณต้องดูสถานะเพื่อดูว่านี่เป็นจุดเริ่มต้นกลางหรือตอนท้ายของกิจกรรมและดำเนินการตามนั้นหรือไม่ เช่นคุณสามารถทิ้งเหตุการณ์ทั้งหมดหลังจากเริ่มต้นหรือดูการเคลื่อนไหวตามที่คุณต้องการเท่านั้น จากการ อ้างอิงระดับ :

ท่าทางกดยาวอย่างต่อเนื่อง ท่าทางเริ่มต้น (UIGestureRecognizerStateBegan) เมื่อกดจำนวนนิ้วที่อนุญาต (numberOfTouchesRequired) ตามระยะเวลาที่กำหนด (ขั้นต่ำกดกดกำหนดค่า) และสัมผัสไม่เคลื่อนไหวเกินช่วงการเคลื่อนไหวที่อนุญาต (อนุญาตการเคลื่อนย้าย) ตัวรู้จำท่าทางจะเปลี่ยนไปเป็นสถานะเปลี่ยนเมื่อใดก็ตามที่มีการเลื่อนนิ้วและสิ้นสุด (UIGestureRecognizerStateEnded) เมื่อนิ้วมือใดยกขึ้น

ตอนนี้คุณสามารถติดตามสถานะเช่นนี้

-  (void)handleLongPress:(UILongPressGestureRecognizer*)sender { 
    if (sender.state == UIGestureRecognizerStateEnded) {
      NSLog(@"UIGestureRecognizerStateEnded");
    //Do Whatever You want on End of Gesture
     }
    else if (sender.state == UIGestureRecognizerStateBegan){
       NSLog(@"UIGestureRecognizerStateBegan.");
   //Do Whatever You want on Began of Gesture
     }
  }

4
คำตอบต่อไปแสดงให้เห็นถึงวิธีการทำ แต่ฉันให้คำตอบนี้ +1 เพราะคำอธิบายโดยละเอียดและเชื่อมโยงไปยังเอกสาร
Matt Connolly

2
อาจมีประโยชน์มากกว่าด้วยตัวอย่างรหัสแทนที่จะเชื่อมโยงกับเอกสารประกอบเท่านั้น ฉันโพสต์ข้อมูลโค้ดด้านล่างแล้ว ตรวจสอบสถานะ UIGestureRecognizerStateBegan
Paul Solt

UIGestureRecognizerStateChanged
Rajneesh071

@joelm คุณช่วยฉัน)
Evgeniy Kleban

สำหรับ Swift 4: if (sender.state == UITapGestureRecognizer.State.ended) {// ทำทุกอย่างที่คุณต้องการเมื่อสิ้นสุดการพิมพ์ท่าทาง ("\ n * longpressed * \ n")}
Ravi

117

ในการตรวจสอบสถานะของ UILongPressGestureRecognizer เพียงเพิ่มคำสั่ง if ในวิธีการเลือก:

- (void)handleLongPress:(UILongPressGestureRecognizer *)sender {    
    if (sender.state == UIGestureRecognizerStateEnded) {
        NSLog(@"Long press Ended");
    } else if (sender.state == UIGestureRecognizerStateBegan) {
        NSLog(@"Long press detected.");
    }
}

13
คุณไม่ต้องการให้ if / else บล็อกเนื่องจากมีสถานะมากกว่า Ended "ตรวจพบกดแบบยาว" จะพิมพ์หลายครั้งเมื่อสถานะเปลี่ยนแปลง ตรวจสอบสถานะ UIGestureRecognizerStateBegan แทน
Paul Solt

2
บางคนควรแก้ไขคำตอบนั้นเพื่อให้สอดคล้องกับสิ่งที่ความคิดเห็นยอดนิยมพูด มันยืนรหัสที่ให้ไม่ทำงาน
Declan McKenna

75

คุณต้องตรวจสอบสถานะที่ถูกต้องเนื่องจากมีพฤติกรรมที่แตกต่างกันสำหรับแต่ละรัฐ ส่วนใหญ่มีแนวโน้มที่คุณจะต้องมีรัฐกับUIGestureRecognizerStateBeganUILongPressGestureRecognizer

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
                                             initWithTarget:self 
                                             action:@selector(handleLongPress:)];
longPress.minimumPressDuration = 1.0;
[myView addGestureRecognizer:longPress];
[longPress release];

...

- (void)handleLongPress:(UILongPressGestureRecognizer *)gesture {
    if(UIGestureRecognizerStateBegan == gesture.state) {
        // Called on start of gesture, do work here
    }

    if(UIGestureRecognizerStateChanged == gesture.state) {
        // Do repeated work here (repeats continuously) while finger is down
    }

    if(UIGestureRecognizerStateEnded == gesture.state) {
        // Do end work here when finger is lifted
    }
}

2
ดูเหมือนว่าคุณต้องขยับนิ้วของคุณเพื่อให้ได้สถานะที่เปลี่ยน ถูกต้องหรือไม่
Arcadian

อาจทำให้ StateChanged เมื่อเลื่อนนิ้วไปมาเสียงคล้ายกับสิ่งที่ฉันทำในรหัสทดสอบ
พอล Solt

UIGestureRecognizerStateBegan ดูเหมือนว่าจะถูกเรียกเพียงครั้งเดียวซึ่งเหมาะสำหรับสถานการณ์ของฉันพยายามที่จะแสดงกล่องโต้ตอบในการตรวจสอบการกดแบบยาวบนปุ่ม สถานะอื่นถูกเรียกหลายครั้ง ขอบคุณ!
Damian

19

ลองทำสิ่งนี้:

Objective-C

- (void)handleLongPress:(UILongPressGestureRecognizer*)sender { 
    if (sender.state == UIGestureRecognizerStateEnded) {
        NSLog(@"Long press Ended");
    } else if (sender.state == UIGestureRecognizerStateBegan) {
        NSLog(@"Long press detected.");
    }
}

สวิฟท์ 2.2:

func handleLongPress(sender:UILongPressGestureRecognizer) {

        if (sender.state == UIGestureRecognizerState.Ended) {
            print("Long press Ended");
        } else if (sender.state == UIGestureRecognizerState.Began) {
            print("Long press detected.");
        }
}

14

นี่คือวิธีจัดการกับมันใน Swift:

func longPress(sender:UILongPressGestureRecognizer!) {

        if (sender.state == UIGestureRecognizerState.Ended) {
            println("Long press Ended");
        } else if (sender.state == UIGestureRecognizerState.Began) {
            println("Long press detected.");
        }
}

13

สวิฟท์ 3.0:

func handleLongPress(sender: UILongPressGestureRecognizer) {

    if sender.state == .ended {
        print("Long press Ended")
    } else if sender.state == .began {
        print("Long press detected")
    }

6

ตัวจัดการรูปแบบลายเส้นของคุณจะรับสายสำหรับแต่ละสถานะรูปแบบลายเส้น ดังนั้นคุณต้องทำการตรวจสอบสำหรับแต่ละรัฐและใส่รหัสของคุณในสถานะที่ต้องการ

เราจะต้องเลือกใช้สวิตช์ตัวพิมพ์ใหญ่กว่าถ้า - อื่น:

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
                                         initWithTarget:self 
                                         action:@selector(handleLongPress:)];
    longPress.minimumPressDuration = 1.0;
    [myView addGestureRecognizer:longPress];
    [longPress release];

-(void)handleLongPress:(UILongPressGestureRecognizer *)gesture {
        switch(gesture.state){
          case UIGestureRecognizerStateBegan:
               NSLog(@"State Began");
               break;
          case UIGestureRecognizerStateChanged:
               NSLog(@"State changed");
               break;
          case UIGestureRecognizerStateEnded:
               NSLog(@"State End");
               break;
          default:
               break;
         }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.