Можете ли вы присоединить 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.
Первоначально то, что я использовал, я взял только один
2) Установите ссылки на розетки в UIButton
и направил действия с Владелец файла.
Примечание: Если у вас есть несколько 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;
}
}
}