Как вызвать жест касанием на UIView программно в Swift


167

У меня есть UIView, и я добавил к нему жест касания:

let tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
tap.delegate = self
myView.addGesture(tap)

Я пытаюсь вызвать это программно в тестовом файле.

sendActionForEvent

Я использую эту функцию, но она не работает:

myView.sendActionForEvent(UIEvents.touchUpDown)

Показывает нераспознанный селектор, отправленный экземпляру.

Как я могу решить эту проблему?


2
В swift 2.2 вы можете использовать новый синтаксис селектора: let tap = UITapGestureRecognizer (target: self, action: #selector (self.handleTap (_ :)))
Wujo

@wujo - спасибо за это; странно, это на самом деле не работает для меня, в UIView Может быть, только в контроллере представления?
Толстяк

2
Также не забудьте иметь, imageView.userInteractionEnabled = trueесли вы используете вид изображения. Занимался этим слишком долго.
Джош

@ Джош, да важный момент.
NeverHopeless

1
@KhangAzun лучший вариант - это вызвать функцию крана напрямую
Джордж

Ответы:


246

Вам нужно инициализировать UITapGestureRecognizerс целью и действием, например так:

let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
myView.addGestureRecognizer(tap)

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

@objc func handleTap(_ sender: UITapGestureRecognizer? = nil) {
    // handling code
}

Теперь вызов вашего обработчика событий распознавания жестов касания так же прост, как вызов метода:

handleTap()

вместо прямого вызова функции выбора, я хочу вызвать ее, программно вызвав событие UITapGestureRecognizer
Джордж

2
@muhasturk Не изменяйте значение ответа против голосования. Ваше изменение аннулировало ответ для более старых версий Swift. Если вы хотите опубликовать обновление для Swift 2.2, оставьте свой ответ. Спасибо.
Эрик Ая

17
tap.delegate = selfне нужен, так как вы уже установили цель и действие
Даниэль

4
Выдает ошибку в Swift3, ваша функция нажатия на ручку должна быть: func handleTap (_ sender: UITapGestureRecognizer)
Travis M.

Вызывающая функция должна быть ................ func handleTap (_ sender: UITapGestureRecognizer? = Nil) ............... вы пропустили "_ «........ так что ваша функция вызова не работает ..
Прасад Патил

94

Для тех, кто ищет решение Swift 3

let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))

view.addGestureRecognizer(tap)

view.isUserInteractionEnabled = true

self.view.addSubview(view)

// function which is triggered when handleTap is called
 func handleTap(_ sender: UITapGestureRecognizer) {
     print("Hello World")
  }

1
isUserInteractionEnabledдействительно необходимо? по умолчанию ложь?
jose920405

6
view.isUserInteractionEnabled = trueявляется ключом, когда вы используете ImageView или любой подкласс UIVIew вместо UIControl.
Панкадж

61

Для Swift 4 :

let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))

view.addGestureRecognizer(tap)

view.isUserInteractionEnabled = true

self.view.addSubview(view)

// function which is triggered when handleTap is called
@objc func handleTap(_ sender: UITapGestureRecognizer) {
    print("Hello World")
}

В Swift 4 вам нужно явно указать, что триггерная функция вызывается из Objective-C, поэтому вам нужно добавить @objc также в свою функцию handleTap.

Смотрите ответ @Ali Beadle здесь: Swift 4 добавить жест: переопределить против @objc


view.isUserInteractionEnabled = trueявляется ключом, когда вы используете ImageView или любой подкласс UIVIew вместо UIControl.
Панкадж Кулкарни

50

Просто примечание - не забудьте включить взаимодействие в представлении:

let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))

view.addGestureRecognizer(tap)

// view.userInteractionEnabled = true

self.view.addSubview(view)

1
Примечание важно!
Итай Спектор

21

ШАГ 1

@IBOutlet var viewTap: UIView!

ШАГ 2

var tapGesture = UITapGestureRecognizer()

ШАГ 3

override func viewDidLoad() {
    super.viewDidLoad()
    // TAP Gesture
    tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.myviewTapped(_:)))
    tapGesture.numberOfTapsRequired = 1
    tapGesture.numberOfTouchesRequired = 1
    viewTap.addGestureRecognizer(tapGesture)
    viewTap.isUserInteractionEnabled = true
}

ШАГ: 4

func myviewTapped(_ sender: UITapGestureRecognizer) {

    if self.viewTap.backgroundColor == UIColor.yellow {
        self.viewTap.backgroundColor = UIColor.green
    }else{
        self.viewTap.backgroundColor = UIColor.yellow
    }
}

ВЫВОД

введите описание изображения здесь


14

Реализация жеста крана

let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "touchHappen") 
view.userInteractionEnabled = true
view.addGestureRecognizer(tap)

Вызывает эту функцию при распознавании касания.

func touchHappen() {
    //Causes the view (or one of its embedded text fields) to resign the first responder status.
    self.view.endEditing(true)
}

Обновление для For Swift 3

let tap = UITapGestureRecognizer(target: self, action: #selector(self.touchHappen(_:)))
view.addGestureRecognizer(tap)
view.userInteractionEnabled = true

func touchHappen(_ sender: UITapGestureRecognizer) {
    print("Hello Museer")
}

11

Swift 4

let tap = UITapGestureRecognizer(target: self, action: #selector(self.touchTapped(_:)))
    self.view.addGestureRecognizer(tap)

@objc func touchTapped(_ sender: UITapGestureRecognizer) {
}

8

Вот как это работает в Swift 3:

@IBOutlet var myView: UIView!
override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action:#selector(handleTap))

    myView.addGestureRecognizer(tap)
}

func handleTap() {
    print("tapped")
}

7

Полный ответ для Swift 4

Шаг 1: создайте точку для представления

@IBOutlet weak var rightViewOutlet: UIView!

Шаг 2: определить жест касания

var tapGesture = UITapGestureRecognizer()

Шаг 3: создайте функцию ObjC (вызывается при касании вида)

@objc func rightViewTapped(_ recognizer: UIGestureRecognizer) {
    print("Right button is tapped")
}

Шаг 4: добавьте следующее в viewDidLoad ()

let rightTap = UITapGestureRecognizer(target: self, action: #selector(ViewController.rightViewTapped(_:)))
    rightViewOutlet.addGestureRecognizer(rightTap)

Шаг 2 не требуется.
Гвидо

7

Swift 5.1 Пример для трех просмотров

Шаг: 1 -> Добавить представление раскадровки и добавить представление розеткиКонтроллер UIView

@IBOutlet var firstView: UIView!
@IBOutlet var secondView: UIView!
@IBOutlet var thirdView: UIView!

Шаг: 2 -> Добавить тег storyBoard view

FirstView secondView thirdView

Шаг: 3 -> Добавить жест

override func viewDidLoad() {
        super.viewDidLoad()

        firstView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.tap(_:))))
        firstView.isUserInteractionEnabled = true
        secondView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.tap(_:))))
        secondView.isUserInteractionEnabled = true
        thirdView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.tap(_:))))
        thirdView.isUserInteractionEnabled = true
    }

Шаг: 4 -> выберите вид

@objc func tap(_ gestureRecognizer: UITapGestureRecognizer) {
        let tag = gestureRecognizer.view?.tag
        switch tag! {
        case 1 :
            print("select first view")
        case 2 :
            print("select second view")
        case 3 :
            print("select third view")
        default:
            print("default")
        }
    }

6

Я работал на Xcode 6.4 на Swift. Увидеть ниже.

var view1: UIView!

func assignTapToView1() {          
  let tap = UITapGestureRecognizer(target: self, action: Selector("handleTap"))
  //  tap.delegate = self
  view1.addGestureRecognizer(tap)
  self.view .addSubview(view1)

...
}

func handleTap() {
 print("tap working")
 view1.removeFromSuperview()
 // view1.alpha = 0.1
}

5

Если вы хотите, чтобы код Objective C был приведен ниже,

UITapGestureRecognizer *gesRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; // Declare the Gesture.
gesRecognizer.delegate = self;
[yourView addGestureRecognizer:gesRecognizer]; // Add Gesture to your view.

// Declare the Gesture Recognizer handler method.

- (void)handleTap:(UITapGestureRecognizer *)gestureRecognizer{
   NSLog(@"Tapped");
}

или вы хотите быстрый код указан ниже,

import UIKit
class ViewController: UIViewController {

    @IBOutlet weak var myView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Add tap gesture recognizer to view
        let tapGesture = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
        myView.addGestureRecognizer(tapGesture)
    }

    // this method is called when a tap is recognized
    func handleTap(sender: UITapGestureRecognizer) {

        print("tap")
    }
}

5

Вам нужно инициализировать UITapGestureRecognizer с целью и действием, например так:

let tap = UITapGestureRecognizer(target: self, action: "handleTap:")
tap.delegate = self
myView.addGestureRecognizer(tap)

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

func handleTap(sender: UITapGestureRecognizer) {
  // handling code
}

3
    let tap = UITapGestureRecognizer(target: self, action: Selector("handleFrontTap:"))
    frontView.addGestureRecognizer(tap)

// Make sure this is not private
func handleFrontTap(gestureRecognizer: UITapGestureRecognizer) {
    print("tap working")
}

3

Swift 4

Сначала создайте объект UITapGestureRecognizer

var tapGesture = UITapGestureRecognizer()

Второй шаг - инициализация UITapGestureReconizer. Включите взаимодействие с пользователем, затем добавьте его.

override func viewDidLoad() {
        super.viewDidLoad()
    tapGesture = UITapGestureRecognizer(target: self, action: #selector(YourViewController.myviewTapped(_:)))
            infosView.isUserInteractionEnabled = true
            infosView.addGestureRecognizer(tapGesture)
view.addSubview(infosView)
}

В-третьих, создать метод

@objc func myviewTapped(_ recognizer: UIGestureRecognizer) {
                print("button is tapped")
            }

3

попробуйте следующее расширение

    extension UIView {

    func  addTapGesture(action : @escaping ()->Void ){
        let tap = MyTapGestureRecognizer(target: self , action: #selector(self.handleTap(_:)))
        tap.action = action
        tap.numberOfTapsRequired = 1

        self.addGestureRecognizer(tap)
        self.isUserInteractionEnabled = true

    }
    @objc func handleTap(_ sender: MyTapGestureRecognizer) {
        sender.action!()
    }
}

class MyTapGestureRecognizer: UITapGestureRecognizer {
    var action : (()->Void)? = nil
}

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

submitBtn.addTapGesture {
     //your code
}

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

cell.addTapGesture {
     //your code
}

1
Хотя ответ только для кода действительно является ответом, небольшое объяснение (почему код OP не работает, какова общая идея вашего кода, важные моменты, предупреждения и т. Д.) Может сделать его лучшим ответом.
Ифурини

2

Я работал на Xcode 7.3.1 на Swift 2.2. Увидеть ниже.

func addTapGesture() {
    let tap = UITapGestureRecognizer(target: self, action: #selector(MyViewController.handleTap))
    tap.numberOfTapsRequired = 1
    self.myView.addGestureRecognizer(tap)
}

func handleTap() {
    // Your code here...
}

1
добавьте addTapGesture()в свойviewDidLoad()
Дая Кевин

1

Я хотел указать два момента, которые вызывали у меня проблемы.

  • Я создавал Gesture Recognizer для init и сохранял его в свойстве let. По-видимому, добавление этого жеста в журнал не работает. Может быть, сам объект передается в распознаватель жестов во время инициализации, неправильно настроен.
  • Распознаватель жестов не следует добавлять к представлениям с нулевыми кадрами. Я создаю все мои представления с нулевым фреймом, а затем изменяю их размер с помощью автоматического размещения. Распознаватели жестов должны быть добавлены ПОСЛЕ ТОГО, КАК размеры были изменены механизмом автоматического размещения. Поэтому я добавляю распознаватель жестов в viewDidAppear, и они работают.

1

xCode 9.3, Swift 4.0

class BaseVC: UIViewController, UIGestureRecognizerDelegate { 

      @IBOutlet weak var iView: UIView!

      override func viewDidLoad() {
          super.viewDidLoad()
          let clickUITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.onSelect(_:)))
          clickUITapGestureRecognizer.delegate = self
          iView?.addGestureRecognizer(tap)
      }

      func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
          return true
      }


     @IBAction func onSelect(_ sender: Any) {

     }
}

Функция onSelect не обязательно должна быть IBAction
Илья Крит

iView? .addGestureRecognizer (нажмите) Имя вашего жеста-распознавателя - clickUITapGestureRecognizer. Итак, правильный путь: iView? .addGestureRecognizer (clickUITapGestureRecognizer)
Илья Крит,

1

Внутри ViewDidLoad

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
    self.imgMainAdView.isUserInteractionEnabled = true
    self.imgMainAdView.addGestureRecognizer(tapGestureRecognizer)

//MARK: - Image Tap Method -
@objc func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
{
    print("Tapped")
    if let url = URL(string: self.strMAinAdvLink)
    {
        UIApplication.shared.open(url, options: [:])
    }
}

Цель вызова

@IBAction func btnCall1Action(_ sender: Any)
{
    let text = self.strPhoneNumber1!
    let test = String(text.filter { !" -()".contains($0) })
    UIApplication.shared.openURL(NSURL(string: "tel://\(test)")! as URL)
}

Почта Цель

MFMailComposeViewControllerDelegate

 @IBAction func btnMailAction(_ sender: Any)
{
    let strEmail = SAFESTRING(str:  (self.dictEventDetails?.value(forKeyPath: "Email.value_text.email") as! String))

    if !MFMailComposeViewController.canSendMail()
    {
        AppDelegate.sharedInstance().showAlertAction(strTitle: "OK", strMessage: "Mail services are not available") { (success) in
        }
        return
    }
    let composeVC = MFMailComposeViewController()
    composeVC.mailComposeDelegate = self
    composeVC.setToRecipients([strEmail])
    composeVC.setSubject("")
    composeVC.setMessageBody("", isHTML: false)
    self.present(composeVC, animated: true, completion: nil)
}
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?)
{
    controller.dismiss(animated: true, completion: nil)
}

1

Вот самый простой способ добавить жесты на просмотр в Swift 5

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        addGestures()
    }

    // MARK: Add Gestures to target view
    func addGestures()
    {
        // 1. Single Tap or Touch
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tapGetstureDetected))
        tapGesture.numberOfTapsRequired = 1
        view.addGestureRecognizer(tapGesture)

        //2. Double Tap
        let doubleTapGesture = UITapGestureRecognizer(target: self, action: #selector(self.doubleTapGestureDetected))
        doubleTapGesture.numberOfTapsRequired = 2
        view.addGestureRecognizer(doubleTapGesture)

        //3. Swipe
        let swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(self.swipeGetstureDetected))
        view.addGestureRecognizer(swipeGesture)

        //4. Pinch
        let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(self.pinchGetstureDetected))
        view.addGestureRecognizer(pinchGesture)

        //5. Long Press
        let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(self.longPressGetstureDetected))
        view.addGestureRecognizer(longPressGesture)

        //6. Pan
        let panGesture = UILongPressGestureRecognizer(target: self, action: #selector(self.panGestureDetected))
        view.addGestureRecognizer(panGesture)

    }

    // MARK: Handle Gesture detection
    @objc func swipeGetstureDetected() {
        print("Swipe Gesture detected!!")
    }

    @objc func tapGetstureDetected() {
        print("Touch/Tap Gesture detected!!")
    }

    @objc func pinchGetstureDetected() {
        print("Pinch Gesture detected!!")
    }

    @objc func longPressGetstureDetected() {
        print("Long Press Gesture detected!!")
    }

    @objc func doubleTapGestureDetected() {
        print("Double Tap Gesture detected!!")
    }

    @objc func panGestureDetected()
    {
        print("Pan Gesture detected!!")
    }


    //MARK: Shake Gesture
    override func becomeFirstResponder() -> Bool {
        return true
    }
    override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?){
        if motion == .motionShake
        {
            print("Shake Gesture Detected")
        }
    }
}

0

Попробуйте следующий быстрый код (проверено в Xcode 6.3.1):

    import UIKit

    class KEUITapGesture150427 : UIViewController {
      var _myTap: UITapGestureRecognizer?
      var _myView: UIView?

      override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.whiteColor();

        _myTap = UITapGestureRecognizer(target: self
, action: Selector("_myHandleTap:"))
        _myTap!.numberOfTapsRequired = 1

        _myView = UIView(frame: CGRectMake(100, 200, 100, 100))
        _myView!.backgroundColor=UIColor.blueColor()
        _myView!.layer.cornerRadius = 20
        _myView!.layer.borderWidth = 1
        _myView!.addGestureRecognizer(_myTap!)
        view.addSubview(_myView!)
      }

      func _myHandleTap(sender: UITapGestureRecognizer) {
        if sender.state == .Ended {
          println("_myHandleTap(sender.state == .Ended)")
          sender.view!.backgroundColor
          = UIColor(red: CGFloat(drand48()), green: CGFloat(drand48()), blue: CGFloat(drand48()), alpha: 1.0);
        }
      }
    }

Обратите внимание, что вашей целью может быть любой подкласс UIResponder, см. (Протестировано в Xcode 6.3.1):

    import UIKit

    class MyTapTarget  : UIResponder {
      func _myHandleTap2(sender: UITapGestureRecognizer) {
        if sender.state == .Ended {
          println("_myHandleTap2(sender.state == .Ended)")
          sender.view!.backgroundColor
            = UIColor(red: CGFloat(drand48()), green: CGFloat(drand48()), blue: CGFloat(drand48()), alpha: 1.0);
        }
      }
    }

    class KEUITapGesture150427b : UIViewController {
      var _myTap: UITapGestureRecognizer?
      var _myView: UIView?
      var _myTapTarget: MyTapTarget?

      override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.whiteColor();

        _myTapTarget = MyTapTarget()
        _myTap = UITapGestureRecognizer(target: _myTapTarget!
, action: Selector("_myHandleTap2:"))
        _myTap!.numberOfTapsRequired = 1

        _myView = UIView(frame: CGRectMake(100, 200, 100, 100))
        _myView!.backgroundColor=UIColor.blueColor()
        _myView!.layer.cornerRadius = 20
        _myView!.layer.borderWidth = 1
        _myView!.addGestureRecognizer(_myTap!)
        view.addSubview(_myView!)
      }
    }

0

Вместо вызова UITapGestureRecognizer myView, вы можете напрямую вызвать handleTapфункцию,

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.