it-swarm.com.ru

UITapGestureRecognizer не работает в UIImageView

У меня был следующий код:

UITapGestureRecognizer *showStoryTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showNewsStory:)];
[showStoryTapRecognizer setDelegate:self];
[self.storyImageView_ addGestureRecognizer:showStoryTapRecognizer];
[showStoryTapRecognizer release];

Это, однако, не вызывает showNewsStory, почему это? Я включил userInteraction в представлении изображения.

22
xonegirlz
UITapGestureRecognizer *oneTouch=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(OneTouchHandeler)];

[oneTouch setNumberOfTouchesRequired:1];

[imageView addGestureRecognizer:oneTouch];

imageView.userInteractionEnabled = YES;
49
user1503512

Вы должны включить взаимодействие с пользователем для объекта UIImageView:

[self.storyImageView_ setUserInteractionEnabled:YES];

Правка:

Попробуйте удалить

[showStoryTapRecognizer setDelegate:self];

Я не думаю, что UITapGestureRecognizer имеет свои методы делегата, насколько я знаю . </ Strike>

71
Kjuly

UIImageView является единственным подклассом UIView внутри UIKit, для которого по умолчанию отключено взаимодействие с пользователем.

9
Radif Sharafullin

Возможно ... action:@selector(showNewsStory) вместо action:@selector(showNewsStory:) . Пожалуйста, проверьте его . Есть ли другие UITapGestureRecognizer в этом контроллере? Попробуй это:

otherTapRecognizer.cancelsTouchesInView = NO;
4
Carina

Я также заметил, что в Swift3, если вы добавляете распознаватель жестов, который также ищет цель, а целью обычно является self, то вам нужно сделать UIView, к которому вы добавляете распознаватель жестов, lazy var. В противном случае распознаватель жестов не будет работать. Я думаю, что это ошибка в Swift3. В идеале, если вы обращаетесь к self в переменной до того, как класс полностью инициализирован, он должен выдать ошибку. Код ниже не обнаружит распознаватель жестов.

let messageImageView: CachedImageView = {
    let iv = CachedImageView()
    iv.translatesAutoresizingMaskIntoConstraints = false
    iv.layer.cornerRadius = 16
    iv.layer.masksToBounds = true
    iv.contentMode = .scaleAspectFill
    iv.isUserInteractionEnabled = true
    let zoomTap = UITapGestureRecognizer(target: self, action: #selector(handleZoomTap))
    zoomTap.numberOfTapsRequired = 1
    iv.addGestureRecognizer(zoomTap)
    return iv
}()

Чтобы это исправить, вы должны использовать lazy var

lazy var messageImageView: CachedImageView = {
    let iv = CachedImageView()
    iv.translatesAutoresizingMaskIntoConstraints = false
    iv.layer.cornerRadius = 16
    iv.layer.masksToBounds = true
    iv.contentMode = .scaleAspectFill
    iv.isUserInteractionEnabled = true
    let zoomTap = UITapGestureRecognizer(target: self, action: #selector(handleZoomTap))
    zoomTap.numberOfTapsRequired = 1
    iv.addGestureRecognizer(zoomTap)
    return iv
}()
3
quantdaddy

цель-CIOS 10

UITapGestureRecognizer *oneTouch=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(OneTouchHandeler)];

[oneTouch setNumberOfTouchesRequired:1];

[imageView addGestureRecognizer:oneTouch];

imageView.userInteractionEnabled = YES;

// Swift 3.0

   let oneTouch = UITapGestureRecognizer(target: self, action: #selector(self.OneTouchHandeler(_:)))

imageView.addGestureRecognizer(oneTouch)

imageView.isUserInteractionEnabled = true
1
dahiya_boy

если вы допустили 2 разных жеста, добавьте фрагмент кода ниже. Например, вы используете pickerView, а также хотите обнаружить жест касания для того же самого pickerView.

Спрашивает делегата, следует ли разрешить двум распознавателям жестов распознавать жесты одновременно.

Цель C

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

Свифт

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}
0
Emre Gürses

Если вы уже установили imageView.userInteractionEnabled = YES;, но действие по-прежнему не срабатывает. Может быть, это потому, что для одного из суперпредставлений imageView userInteractionEnabled - НЕТ;

0
dopcn