การกำหนดทิศทางสำหรับ UISwipeGestureRecognizer


132

ฉันต้องการเพิ่มการจดจำท่าทางการปัดอย่างง่ายในโครงการ iPhone ตามมุมมองของฉัน ควรจดจำท่าทางสัมผัสในทุกทิศทาง (ขวา, ลง, ซ้าย, ขึ้น)

มีระบุไว้ในเอกสารสำหรับ UISwipeGestureRecognizer:

คุณสามารถระบุหลายทิศทางโดยระบุค่าคงที่ UISwipeGestureRecognizerDirection หลายตัวโดยใช้ตัวดำเนินการแบบบิตหรือ ทิศทางเริ่มต้นคือ UISwipeGestureRecognizerDirectionRight

อย่างไรก็ตามสำหรับฉันมันไม่ได้ผล เมื่อทั้งสี่ทิศทางเป็น OR'ed จะรับรู้การกวาดนิ้วไปทางซ้ายและขวาเท่านั้น

- (void)viewDidLoad {
    UISwipeGestureRecognizer *recognizer;

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionUp)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release]; 
    [super viewDidLoad];
}

-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {
    NSLog(@"Swipe received.");
}

ฉันแก้ไขสิ่งนี้ด้วยการเพิ่มตัวจดจำสี่ตัวในมุมมอง แต่ฉันอยากรู้ว่าทำไมมันถึงไม่ทำงานตามที่โฆษณาในเอกสาร?

- (void)viewDidLoad {
    UISwipeGestureRecognizer *recognizer;

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release];

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionUp)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release];

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionDown)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release];

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release];

    [super viewDidLoad];
}

-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {
    NSLog(@"Swipe received.");
}

3
มันไม่เกี่ยวข้องกันเลย แต่ [super viewDidLoad]; ควรเป็นคำสั่งแรกใน - (โมฆะ) viewDidLoad
Mihir Mehta

คำตอบ:


115

ดูเหมือนว่ามีจุดบกพร่อง คุณสามารถระบุทิศทางที่อนุญาตได้เช่นเดียวกับที่คุณทำ แต่เมื่อคุณพยายามเข้าถึงทิศทางจริงที่ทำให้เกิดการปัดในวิธีการเลือกการดำเนินการคุณยังคงได้รับมาสก์บิตที่คุณตั้งไว้ในตอนแรก (สำหรับทิศทางที่อนุญาต)

ซึ่งหมายความว่าการตรวจสอบทิศทางจริงจะล้มเหลวเสมอเมื่ออนุญาตมากกว่า 1 ทิศทาง คุณสามารถดูได้ด้วยตัวคุณเองค่อนข้างง่ายเมื่อคุณแสดงค่าของ 'ทิศทาง' ในวิธีการเลือก (เช่น-(void)scrollViewSwiped:(UISwipeGestureRecognizer *)recognizer)

ยื่นรายงานข้อบกพร่อง (# 8276386) ไปยัง Apple

[อัปเดต] ฉันได้รับคำตอบจาก Apple ว่าพฤติกรรมได้ผลตามที่ตั้งใจไว้

ตัวอย่างเช่นในมุมมองตารางคุณสามารถปัดไปทางซ้ายหรือขวาในเซลล์มุมมองตารางเพื่อเรียก "ลบ" (ซึ่งจะมีทิศทางของท่าทางการปัดไปทางซ้ายและขวา)

ซึ่งหมายความว่าวิธีแก้ปัญหาดั้งเดิมเป็นวิธีที่ควรใช้ คุณสมบัติทิศทางสามารถใช้เพื่อรับท่าทางที่จดจำได้อย่างถูกต้องเท่านั้น แต่ไม่สามารถใช้ในวิธีการที่ดำเนินการกับการรับรู้ที่ประสบความสำเร็จเพื่อเปรียบเทียบกับทิศทางจริงที่ทำให้เกิดการจดจำ


35
ฉันยินดีที่จะเดิมพันว่าเกือบทุกคนที่ใช้เครื่องมือจดจำท่าทางการปัดเป็นครั้งแรกทำให้สมมติฐานที่ไม่ถูกต้องเหมือนกันเกี่ยวกับวิธีการทำงานของคุณสมบัติทิศทาง
memmons

มันโง่มากที่ต้องสร้างตัวจดจำที่แตกต่างกัน 4 แบบเพื่อติดตามขึ้นลงกวาดนิ้วไปทางซ้ายและขวา แต่คุณก็มี
memmons

ว้าวที่ค่อนข้างแย่ไม่ใช่เรื่องใหญ่ แต่ดูเหมือนว่ามีบางอย่างที่พวกเขาสามารถเพิ่มได้
marchinram

2
ไฟล์ส่วนหัวของพวกเขากล่าวว่า: @property (nonatomic) ทิศทาง UISwipeGestureRecognizerDirection; // ค่าเริ่มต้นคือ UISwipeGestureRecognizerDirectionRight ทิศทางที่ต้องการของการปัด อาจระบุได้หลายทิศทาง
nicktmro

1
เห็นด้วยว่านี่เป็นการใช้งานที่แปลกประหลาดในส่วนของ Apple คุณควรระบุได้หลายทิศทางจากนั้นทดสอบทิศทางใดทิศทางหนึ่ง
ChrisP

25

ฉันสังเกตเห็นว่าท่าทางสัมผัสซ้าย / ขวาและขึ้น / ลงทำงานร่วมกันเป็นคู่ดังนั้นคุณต้องระบุตัวจดจำท่าทางสองตัวเท่านั้น และดูเหมือนว่าเอกสารจะไม่ถูกต้อง


นี่คือวิธีแก้ปัญหาที่ถูกต้อง 2 GR หนึ่งอันสำหรับขึ้นและลง / หนึ่งอันสำหรับซ้ายและขวา บิงโก!
logancautrell

22

มันแย่มากฉันแก้ปัญหาด้วยการเพิ่ม 2 ท่าทางเหมือนที่ Lars พูดถึงและทำงานได้อย่างสมบูรณ์ ...

1) ซ้าย / ขวา 2) ขึ้น / ลง

  

UISwipeGestureRecognizer *swipeLeftRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
    [swipeLeftRight setDirection:(UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft )];
    [self.view addGestureRecognizer:swipeLeftRight];

    UISwipeGestureRecognizer *swipeUpDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
    [swipeUpDown setDirection:(UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown )];
    [self.view addGestureRecognizer:swipeUpDown];

13
UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipe:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
[self.view addGestureRecognizer:recognizer];
[recognizer release];

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipe:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
[self.view addGestureRecognizer:recognizer];
[recognizer release];

ตอนนี้เป็นฟังก์ชัน didSwipe

- (void) didSwipe:(UISwipeGestureRecognizer *)recognizer{
      if([recognizer direction] == UISwipeGestureRecognizerDirectionLeft){
          //Swipe from right to left
          //Do your functions here
      }else{
          //Swipe from left to right
          //Do your functions here
      }
 }

5

หากคุณใช้ Xcode 4.2 คุณสามารถเพิ่ม Gesture Recognizers @ storyboard จากนั้นเชื่อมโยง GUI Gesture Recognizers กับ IBActions

คุณสามารถค้นหา Gesture Recognizers ได้ใน Object Library ของหน้าต่าง Utility (ด้านล่างสุดของบานหน้าต่างด้านขวา)

จากนั้นก็เป็นเพียงเรื่องของการควบคุมลากไปยังการกระทำที่เหมาะสม


5

หากคุณต้องการให้ตรวจจับทั้งสี่ทิศทางคุณจะต้องสร้างสี่อินสแตนซ์ดังที่คุณทำในการแก้ไขปัญหา

นี่คือเหตุผล : อินสแตนซ์เดียวกันของ UISwipeGestureRecognizer ที่คุณสร้างคืออินสแตนซ์ที่ส่งผ่านไปยังตัวเลือกในฐานะผู้ส่ง ดังนั้นหากคุณตั้งค่าให้รับรู้ทั้งสี่ทิศทางมันจะกลับมาเป็นจริงsgr.direction == xxxโดยที่ xxx คือทิศทางใดทิศทางหนึ่งในสี่ทิศทาง

นี่เป็นทางเลือกในการแก้ไขปัญหาที่เกี่ยวข้องกับโค้ดน้อยลง (ถือว่าใช้ ARC)

for(int d = UISwipeGestureRecognizerDirectionRight; d <= UISwipeGestureRecognizerDirectionDown; d = d*2) {
    UISwipeGestureRecognizer *sgr = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    sgr.direction = d;
    [self.view addGestureRecognizer:sgr];
}

3

Swift 2.1

ฉันต้องใช้สิ่งต่อไปนี้

    for var x in [
        UISwipeGestureRecognizerDirection.Left,
        UISwipeGestureRecognizerDirection.Right,
        UISwipeGestureRecognizerDirection.Up,
        UISwipeGestureRecognizerDirection.Down
    ] {
        let r = UISwipeGestureRecognizer(target: self, action: "swipe:")
        r.direction = x
        self.view.addGestureRecognizer(r)
    }

2

นี่คือตัวอย่างโค้ดสำหรับการใช้งาน UISwipeGestureRecognizer หมายเหตุความคิดเห็น

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //add gesture recognizer. The 'direction' property of UISwipeGestureRecognizer only sets the allowable directions. It does not return to the user the direction that was actaully swiped. Must set up separate gesture recognizers to handle the specific directions for which I want an outcome.
    UISwipeGestureRecognizer *gestureRight;
    UISwipeGestureRecognizer *gestureLeft;
    gestureRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRight:)];//direction is set by default.
    gestureLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeLeft:)];//need to set direction.
    [gestureLeft setDirection:(UISwipeGestureRecognizerDirectionLeft)];
    //[gesture setNumberOfTouchesRequired:1];//default is 1
    [[self view] addGestureRecognizer:gestureRight];//this gets things rolling.
    [[self view] addGestureRecognizer:gestureLeft];//this gets things rolling.
}

SwipeRight และ SwipeLeft เป็นวิธีการที่คุณใช้เพื่อดำเนินกิจกรรมเฉพาะตามการปัดไปทางซ้ายหรือขวา ตัวอย่างเช่น:

- (void)swipeRight:(UISwipeGestureRecognizer *)gesture
{
    NSLog(@"Right Swipe received.");//Lets you know this method was called by gesture recognizer.
    NSLog(@"Direction is: %i", gesture.direction);//Lets you know the numeric value of the gesture direction for confirmation (1=right).
    //only interested in gesture if gesture state == changed or ended (From Paul Hegarty @ standford U
    if ((gesture.state == UIGestureRecognizerStateChanged) ||
    (gesture.state == UIGestureRecognizerStateEnded)) {

    //do something for a right swipe gesture.
    }
}

2
UISwipeGestureRecognizer *Updown=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleGestureNext:)];
            Updown.delegate=self;
            [Updown setDirection:UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp];
            [overLayView addGestureRecognizer:Updown];

            UISwipeGestureRecognizer *LeftRight=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleGestureNext:)];
            LeftRight.delegate=self;
            [LeftRight setDirection:UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight];
            [overLayView addGestureRecognizer:LeftRight];
            overLayView.userInteractionEnabled=NO;


    -(void)handleGestureNext:(UISwipeGestureRecognizer *)recognizer
    {
        NSLog(@"Swipe Recevied");
        //Left
        //Right
        //Top
        //Bottom
    }

1

อืมแปลกมันใช้ได้กับฉันฉันทำแบบเดียวกันเป๊ะ

คิดว่าคุณควรลองดู

วิธี UIGestureRecognizerDelegate

- (BOOL)gestureRecognizerShouldBegin:(UISwipeGestureRecognizer *)gestureRecognizer {
   // also try to look what's wrong with gesture
   NSLog(@"should began gesture %@", gestureRecognizer);
   return YES;
}

ในบันทึกคุณต้องเห็นสิ่งต่างๆเช่น:

ควรเริ่มท่าทาง; target = <(action = actionForUpDownSwipeGestureRecognizer :, target =)>; ทิศทาง = ขึ้นลงซ้ายขวา>


อะไรไม่ได้ผล? GestureRecognizerShouldBegin: ใช้งานได้ดี
Danyal Aytekin


0

นี่ทำให้ฉันแทบบ้า ในที่สุดฉันก็ค้นพบวิธีที่เชื่อถือได้ในการมี SwipeGestureRecognizers หลายตัว

ดูเหมือนว่ามีข้อบกพร่องใน iOS หากชื่อของตัวเลือก "การกระทำ" ของคุณเหมือนกันในการปัดหลายครั้ง หากคุณเพียงแค่ตั้งชื่อให้แตกต่างกันเช่น handleLeftSwipeFrom และ handleRightSwipeFrom ทุกอย่างก็ใช้ได้

UISwipeGestureRecognizer *recognizer;

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleLeftSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleRightSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.