Можете ли вы присоединить UIGestureRecognizer к нескольким представлениям?

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

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

10 ответов


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

посмотреть

вид жест Recognizer очень привязан. (только для чтения)

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

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


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

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

для 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())

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

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

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

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

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

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

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

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

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


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

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

enter image description here Первоначально то, что я использовал, я взял только один

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

enter image description here

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


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

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

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

этот метод поможет вам включить несколько салфеток на одном виде..


Как насчет re write (recreate) ваш GestureRecognize каждый раз, когда вы добавляете распознаватель жестов, указывающий на тот же func. В случае, если это работает. Я использую 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")
}

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

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

этот способ уменьшит несколько различных бесполезных переменных


вы можете сделать это, используя этот код мои представления, которые являются imageviews в 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;
        }
    }
}