Вы можете прикрепить 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свойство выдает его:view
вид, к которому прикреплен распознаватель жестов. (только для чтения)
@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.
Первоначально то, что я в конечном итоге использовал, я взял только один
2) Установите ссылки на розетки в
UIButtonи направил действия с Владелец файла.
Примечание: Если у вас есть несколько UIButton или любой другой объект, вам понадобится отдельный распознаватель жестов для каждого из них. Для получения более подробной информации, пожалуйста, обратитесь к этому моему вопросу.получение неправильного тега UIButton на распознавателе жестов длительного нажатия
переопределить класс на '
<UIScrollViewDelegate>'и использовать этот метод .класс м:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ return YES; }этот метод поможет вам включить несколько салфетки на одном виде..
Как насчет повторной записи (воссоздания) вашего 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") }
если у вас есть фиксированный вид, я предлагаю вам сделать что-то вроде этого
[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; } } }
Первоначально то, что я в конечном итоге использовал, я взял только один 
Comments