Установка направления для UISwipeGestureRecognizer - PullRequest
130 голосов
/ 23 июля 2010

Я хочу добавить простое распознавание жестов смахивания в свой проект iPhone на основе просмотра. Жесты во всех направлениях (вправо, вниз, влево, вверх) должны быть распознаны.

В документации для UISwipeGestureRecognizer указано:

Вы можете указать несколько направлений, указав несколько констант UISwipeGestureRecognizerDirection с использованием побитовых операндов ИЛИ. Направление по умолчанию: UISwipeGestureRecognizerDirectionRight.

Однако для меня это не работает. Когда все четыре направления обозначены «ИЛИ», распознаются только пролистывание влево и вправо.

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

Ответы [ 12 ]

114 голосов
/ 05 августа 2010

Похоже, что есть ошибка.Вы можете указать разрешенные направления, как вы сделали.Но когда вы пытаетесь получить доступ к направлению фактическое , которое вызвало пролистывание в методе выбора действия, вы все равно получаете битовую маску, которую вы изначально установили (для разрешенных направлений).

Это означает, что проверка фактического направления всегда будет неудачной, если разрешено более 1 направления.Вы можете убедиться в этом сами, когда вы выводите значение 'direction' в методе селектора (например, -(void)scrollViewSwiped:(UISwipeGestureRecognizer *)recognizer).

Отправил отчет об ошибке (# 8276386) в Apple.

[Обновить] Я получил ответ от Apple, в котором говорилось, что поведение работает так, как было задумано.

Так, например, в табличном представлении вы можете провести пальцем влево или вправо в ячейке табличного представления, чтобы вызвать «удалить»будет иметь направления жеста смахивания, установленные влево и вправо)

Это означает, что исходный обходной путь - это способ, которым он должен использоваться.Свойство direction можно использовать только для правильного распознавания жестов, но не в методе, выполняемом при успешном распознавании для сравнения с фактическим направлением, которое инициировало распознавание.

25 голосов
/ 29 июля 2010

Я заметил, что жесты влево / вправо и вверх / вниз работают попарно, поэтому вам нужно указать только два распознавателя жестов. И документы, похоже, не так.

22 голосов
/ 23 декабря 2011

Хорошо, что отстой, я решил проблему, добавив 2 жеста, как упомянуто Ларсом, и это прекрасно работает ...

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 голосов
/ 18 сентября 2012
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 голосов
/ 25 июля 2012

Если вы хотите, чтобы он обнаруживал все четыре направления, вам нужно создать четыре экземпляра, как вы это делали при обходе.

Вот почему : тот же экземплярUISwipeGestureRecognizer, который вы создаете, является экземпляром, который передается селектору в качестве отправителя.Поэтому, если вы установите его для распознавания всех четырех направлений, он вернет true для 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];
}
5 голосов
/ 12 января 2012

Если вы используете Xcode 4.2, вы можете добавить Gesture Recognizers @ раскадровку и затем связать GUI Gesture Recognizer с IBActions.

Вы можете найти Gesture Recognizers в Библиотеке объектов на панели утилитправая панель).

Тогда нужно просто перетащить элемент управления к соответствующему действию.

2 голосов
/ 14 марта 2016

Свифт 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 голосов
/ 22 сентября 2014
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 голосов
/ 29 июня 2012

Вот пример кода для использования 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.
    }
}
1 голос
/ 14 марта 2012

используйте это, это должна быть битовая операция

   gesture.direction & UISwipeGestureRecognizerDirectionUp || 
   gesture.direction & UISwipeGestureRecognizerDirectionDown
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...