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

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

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

Ответ 1

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

вид

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

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

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

Ответ 2

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

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

Ответ 3

Для Swift 3, если кто-то требует этого: На основании ответа Бхавика Ратода выше.

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

Ответ 4

Мы можем что-то сделать. Это легко и просто.

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

Ответ 5

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

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

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

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

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

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

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

Ответ 6

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

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

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

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

enter image description here

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

Ответ 7

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

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

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

Этот метод поможет вам задействовать несколько ударов в одном представлении.

Ответ 8

Как насчет повторной записи (воссоздания) вашего 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")
}

Ответ 9

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

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

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

Ответ 10

Вы можете создать общее расширение для просмотра, чтобы легко добавлять распознаватели жестов. Это всего лишь пример, но это может выглядеть так

extension UIView {

    func setGestureRecognizer<Gesture: UIGestureRecognizer>(of type: Gesture.Type, target: Any, actionSelector: Selector, swipeDirection: UISwipeGestureRecognizer.Direction? = nil, numOfTaps: Int = 1) {
    let getRecognizer = type.init(target: target, action: actionSelector)

    switch getRecognizer {
    case let swipeGesture as UISwipeGestureRecognizer:
        guard let direction = swipeDirection else { return }
        swipeGesture.direction = direction
        self.addGestureRecognizer(swipeGesture)
    case let tapGesture as UITapGestureRecognizer:
        tapGesture.numberOfTapsRequired = numOfTaps
        self.addGestureRecognizer(tapGesture)
    default:
        self.addGestureRecognizer(getRecognizer)
    }
  }

}

Чтобы добавить средство распознавания в 2 касания в виде, просто позвоните:

let actionSelector = #selector(actionToExecute)
view.setGestureRecognizer(of: UITapGestureRecognizer.self, target: self, actionSelector: actionSelector, numOfTaps: 2)

Вы также можете легко добавить распознаватель пролистывания

view.setGestureRecognizer(of: UISwipeGestureRecognizer.self, target: self, actionSelector: actionSelector, swipeDirection: .down)

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

Ответ 11

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