Можно ли прикрепить UIGestureRecognizer к нескольким представлениям? - PullRequest
218 голосов
/ 20 января 2011
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTapTap:)];
[self.view1 addGestureRecognizer:tapGesture];
[self.view2 addGestureRecognizer:tapGesture];
[tapGesture release];

В приведенном выше коде распознаются только нажатия на view2.Если я закомментирую третью строку, то нажатия на view1 будут распознаны.Если я прав, и вы можете использовать распознаватель жестов только один раз, я не уверен, является ли это ошибкой или просто нужна дополнительная документация.

Ответы [ 10 ]

317 голосов
/ 06 апреля 2011

A UIGestureRecognizer должен использоваться с одним видом. Я согласен, что документация пятнистая. То, что UIGestureRecognizer имеет одно свойство view, выдает его:

вид

Вид, к которому прикреплен распознаватель жестов. (Только для чтения)

@ свойство (неатомное, только для чтения) UIView * view

Обсуждение Вы присоединяете (или добавляете) распознаватель жестов к объекту UIView используя addGestureRecognizer: способ.

48 голосов
/ 25 октября 2011

Я обошел это, используя ниже.

for (UIButton *aButton in myButtons) {

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

}

Затем в моем методе handleLongPress я просто установил UIButton равным виду распознавателя жестов и изменил то, что я делаю, основываясь на этой кнопке

- (void)handleLongPress:(UILongPressGestureRecognizer*)gesture {
    if ( gesture.state == UIGestureRecognizerStateEnded ) {
        UIButton *whichButton=(UIButton *)[gesture view];
        selectedButton=(UIButton *)[gesture view];
    ....
}
17 голосов
/ 03 ноября 2016

Для Swift 3 на случай, если кому-то это понадобится: на основании ответа Bhavik Rathod выше.

 func setGestureRecognizer() -> UIPanGestureRecognizer {

        var panRecognizer = UIPanGestureRecognizer()

        panRecognizer = UIPanGestureRecognizer (target: self, action: #selector(pan(panGesture:)))
        panRecognizer.minimumNumberOfTouches = 1
        panRecognizer.maximumNumberOfTouches = 1
        return panRecognizer
    }

        ///set the recognize in multiple views
        view1.addGestureRecognizer(setGestureRecognizer())
        view2.addGestureRecognizer(setGestureRecognizer())
8 голосов
/ 13 сентября 2016

Мы можем сделать что-то вроде этого, это легко и просто

1) создать функцию, как показано ниже в вашем контроллере (эта функция будет возвращать GestureRecognizer)

-(UITapGestureRecognizer*)setRecognizer{
     UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(openProfile)];
     [gestureRecognizer setNumberOfTapsRequired:1];
     return gestureRecognizer;
}

2) теперь установите этораспознаватель в нескольких видах

[self.view1 addGestureRecognizer:[self setRecognizer]]; 
[self.view2 addGestureRecognizer:[self setRecognizer]];
8 голосов
/ 07 июля 2015

Нет, вам не следует прикреплять распознаватели жестов к нескольким представлениям.

Эта явная информация содержится в документации Apple:

Распознаватели жестов прикреплены к представлению

Каждый распознаватель жестов связан с одним представлением. В отличие от представление может иметь несколько распознавателей жестов, потому что одно представление может отвечать на различные жесты. Для распознавателя жестов Чтобы распознать прикосновения, возникающие в определенном виде, необходимо приложить распознаватель жестов для этого представления.

Руководство по обработке событий для iOS - Распознаватели жестов Библиотека разработчиков Apple

Хотя, как отмечают другие, в некоторых случаях они могут работать, это явно противоречит документации и может измениться в любой будущей версии iOS.

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

4 голосов
/ 20 марта 2013

Хорошо, если кто-то не хочет писать код для добавления вида жеста для нескольких кнопок, например, kwalker ответил выше, и вы хотите сделать это через Interface Builder, это может помочь вам.

1) Вы можете добавить распознаватель жестов длинным нажатием из библиотеки объектов так же, как добавляете другие объекты, такие как UIButtons и UILabels.

enter image description here Изначально я использовал только один

2). Установитьссылки на выходы на UIButton и отправленные действия с владельцем файла.

enter image description here

Примечание. Если у вас несколько UIButton или любого другого объекта, вам потребуется отдельный жестраспознаватель для каждого из них.Для более подробной информации, пожалуйста, обратитесь к моему вопросу. Неправильная метка UIButton при распознавателе жестов при длинном нажатии

2 голосов
/ 01 ноября 2017

если у вас фиксированный вид, я предлагаю вам сделать что-то вроде этого

[self.view1 addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTapTap:)]];
[self.view2 addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTapTap:)]];

, что уменьшит множество различных бесполезных переменных

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

Как насчет перезаписи (воссоздания) вашего GestureRecognize каждый раз, когда вы добавляете распознаватель жестов, указывающий на одну и ту же функцию. В приведенном ниже случае это работает. Я использую IBOutletCollection

Swift 2:

@IBOutlet var topicView: [UIView]!

override func viewDidLoad() {
        for view in self.topicView as [UIView] {
        view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "viewClicked:"))
    }
}

func viewClicked(recognizer: UITapGestureRecognizer) {
    print("tap")
}
2 голосов
/ 06 декабря 2015

Переопределить класс на '<UIScrollViewDelegate>'

И используйте этот метод в классе .m:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    return YES;
}

Этот метод поможет вам включить несколько пролистываний в одном представлении.

0 голосов
/ 20 сентября 2013

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

- (void)viewDidLoad
{
    firstIV.tag = 501;
    secondIV.tag = 502;
    thirdIV.tag = 503;
    forthIV.tag = 504;

    [self addTapGesturetoImageView: firstIV];
    [self addTapGesturetoImageView: secondIV];
    [self addTapGesturetoImageView: thirdIV];
    [self addTapGesturetoImageView: forthIV];
}

-(void)addTapGesturetoImageView:(UIImageView*)iv
{
    iv.userInteractionEnabled = YES;
    UITapGestureRecognizer * textfielBGIVTapGasture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(textfielBGIVTapped:)];
    textfielBGIVTapGasture.numberOfTapsRequired = 1;
    [iv addGestureRecognizer:textfielBGIVTapGasture];
}

- (void)textfielBGIVTapped:(UITapGestureRecognizer *)recognizer {
    int tag = recognizer.view.tag-500;
    switch (tag) {
        case 1:
        {
            //firstIV tapped;
            break;
        }
        case 2:
        {
            //secondIV tapped;
            break;
        }
        case 3:
        {
            //thirdIV tapped;
            break;
        }
        case 4:
        {
            //forthIV tapped;
            break;
        }
        default: {
            break;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...