Đặt hướng cho UISwipeGestureRecognizer


132

Tôi muốn thêm nhận dạng cử chỉ vuốt đơn giản vào dự án iPhone dựa trên chế độ xem của tôi. Cử chỉ theo mọi hướng (phải, xuống, trái, lên) nên được nhận ra.

Nó được nêu trong các tài liệu cho UISwipeGestureRecognizer:

Bạn có thể chỉ định nhiều hướng bằng cách chỉ định nhiều hằng số UISwipeGestureRecognizerDirection bằng toán hạng bitwise-OR. Hướng mặc định là UISwipeGestureRecognizerDirectionRight.

Tuy nhiên, đối với tôi nó không hoạt động. Khi tất cả bốn hướng được OR'ed, chỉ các thao tác vuốt trái và phải được nhận ra.

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

Tôi đã sửa lỗi này bằng cách thêm bốn trình nhận dạng vào chế độ xem nhưng tôi tò mò muốn biết tại sao nó không hoạt động như quảng cáo trong tài liệu?

- (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
nó hoàn toàn không liên quan, nhưng [super viewDidLoad]; nên là tuyên bố đầu tiên trong - (void) viewDidLoad
Mihir Mehta

Câu trả lời:


115

Có vẻ như có một lỗi. Bạn có thể chỉ định (các) hướng được phép như bạn đã làm. Nhưng khi bạn cố gắng truy cập vào hướng thực tế đã kích hoạt thao tác vuốt trong phương thức chọn hành động, bạn vẫn nhận được mặt nạ bit mà bạn đã đặt ban đầu (đối với các hướng được phép).

Điều này có nghĩa là việc kiểm tra hướng thực tế sẽ luôn thất bại khi cho phép nhiều hơn 1 hướng. Bạn có thể tự mình nhìn thấy nó khá dễ dàng khi bạn xuất giá trị của 'direction' trong phương thức chọn (nghĩa là -(void)scrollViewSwiped:(UISwipeGestureRecognizer *)recognizer).

Đã gửi báo cáo lỗi (# 8276386) cho Apple.

[Cập nhật] Tôi nhận được câu trả lời từ Apple nói rằng hành vi này hoạt động như dự định.

Vì vậy, ví dụ trong chế độ xem bảng, bạn có thể vuốt sang trái hoặc phải trong một ô xem bảng để kích hoạt 'xóa' (điều này sẽ có hướng của cử chỉ vuốt được đặt sang trái và phải)

Điều này có nghĩa là cách giải quyết ban đầu là cách nó được sử dụng. Thuộc tính chỉ có thể được sử dụng để nhận được các cử chỉ chính xác, nhưng không phải trong phương thức được thực hiện trên một nhận dạng thành công để so sánh với hướng thực tế đã kích hoạt nhận dạng.


35
Tôi sẵn sàng đặt cược rằng gần như tất cả mọi người lần đầu tiên sử dụng trình nhận dạng cử chỉ vuốt đều đưa ra giả định chính xác giống hệt nhau về cách hoạt động của thuộc tính hướng.
memmons

Thật ngớ ngẩn khi phải tạo ra 4 bộ nhận dạng khác nhau để theo dõi, vuốt xuống, vuốt sang trái và phải, nhưng vẫn có bạn.
memmons

wow điều đó thật tệ, không phải là một thỏa thuận lớn nhưng có vẻ như là thứ gì đó họ có thể đã thêm vào
marchinram

2
Tệp tiêu đề của họ cho biết: @property (nonatomic) UISwipeGestureRecognizerDirection direction; // mặc định là UISwipeGestureRecognizerDirectionRight. hướng mong muốn của thao tác vuốt. nhiều hướng có thể được chỉ định
nicktmro

1
Đồng ý rằng điều này có vẻ như là một triển khai kỳ lạ trên phần của Apple. Bạn sẽ có thể chỉ định nhiều hướng và sau đó kiểm tra một trong những hướng đó.
ChrisP

25

Tôi nhận thấy rằng các cử chỉ trái / phải và lên / xuống hoạt động cùng nhau theo cặp, vì vậy bạn chỉ cần chỉ định hai nhận dạng cử chỉ. Và các tài liệu dường như là sai.


Đây là giải pháp chính xác. 2 GR, một cho lên và xuống / một cho trái và phải. Chơi lô tô!
logancautrell

22

Thật tệ, tôi đã giải quyết vấn đề bằng cách thêm 2 cử chỉ như Lars đã đề cập và nó hoạt động hoàn hảo ...

1) Trái / Phải 2) Lên / Xuống

  

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

Bây giờ đây là chức năng 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

Nếu bạn sử dụng Xcode 4.2, bạn có thể thêm Trình nhận dạng cử chỉ @ bảng phân cảnh và sau đó liên kết Trình nhận dạng cử chỉ GUI với IBActions.

Bạn có thể tìm thấy Trình nhận dạng cử chỉ trong Thư viện đối tượng của ngăn tiện ích (Phần dưới cùng của khung bên phải).

Sau đó, nó chỉ là vấn đề Kiểm soát kéo đến hành động thích hợp.


5

Nếu bạn muốn nó phát hiện cả bốn hướng, bạn sẽ cần tạo bốn trường hợp, giống như bạn đã làm trong công việc của mình.

Đây là lý do : Ví dụ tương tự của UISwipeGestureRecognizer mà bạn tạo là phiên bản được chuyển đến bộ chọn dưới dạng người gửi. Vì vậy, nếu bạn đặt nó để nhận ra tất cả bốn hướng, nó sẽ trả về đúng cho sgr.direction == xxxvị trí xxx là một trong bốn hướng.

Đây là một giải pháp thay thế liên quan đến việc sử dụng ít mã hơn (giả sử sử dụng 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];
}

2

Đây là một mẫu mã cho việc sử dụng UISwipeGestureRecognizer. Ghi chú ý kiến.

- (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 và swipeLeft là các phương thức mà bạn sử dụng để thực hiện các hoạt động cụ thể dựa trên thao tác vuốt sang trái hoặc phải. Ví dụ:

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

2

Swift 2.1

Tôi đã phải sử dụng như sau

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

1

hmm, lạ thật, nó hoạt động hoàn hảo với tôi, tôi làm chính xác

nghĩ rằng bạn nên thử nhìn vào

Phương pháp UIGestureRecognizerDelegate

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

trong nhật ký bạn phải thấy một cái gì đó như:

nên bắt đầu cử chỉ; target = <(action = actionForUpDownSwipeGestureRecognizer:, target =)>; hướng = lên, xuống, trái, phải>


Cái gì không hoạt động? cử chỉRecognizerShouldBegin: hoạt động tốt.
Danyal Aytekin

1

sử dụng nó, nó sẽ là hoạt động bit

   gesture.direction & UISwipeGestureRecognizerDirectionUp || 
   gesture.direction & UISwipeGestureRecognizerDirectionDown

0

Điều này đã khiến tôi phát điên. Cuối cùng tôi đã tìm ra một cách đáng tin cậy để có nhiều vuốtGestureRec nhận dạng.

Có vẻ như có một lỗi trong iOS nếu tên của bộ chọn "hành động" của bạn giống nhau trên nhiều kiểu vuốtGestureRecognologists. Nếu bạn chỉ đặt tên khác nhau, ví dụ: handleLeftSwipeFrom và handleRightSwipeFrom, mọi thứ đều hoạt động.

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];
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.