Як зателефонувати за допомогою жестів, натисніть на програму UIView швидко


166

У мене є UIView і я додав жест дотику до нього:

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

Я намагаюсь назвати це програмно у тестовому файлі.

sendActionForEvent

Я використовую цю функцію, але вона не працює:

myView.sendActionForEvent(UIEvents.touchUpDown)

Він показує нерозпізнаний селектор, надісланий екземпляру.

Як я можу вирішити цю проблему?


2
У swift 2.2 ви можете використовувати новий синтаксис селектора: нехай tap = UITapGestureRecognizer (ціль: self, action: #selector (self.handleTap (_ :)))
Wujo

@wujo - дякую за це; як не дивно, це насправді не працює для мене, в UIView Можливо лише в контролері перегляду?
Fattie

2
Також не забудьте мати, imageView.userInteractionEnabled = trueякщо ви використовуєте подання зображення. Надовго попався на цьому.
Джош

@Josh, так важливий момент.
NeverHopeless

1
@KhangAzun найкращий варіант - зателефонувати безпосередньо у функцію крана
Джордж

Відповіді:


245

Вам потрібно ініціалізувати 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 (_ відправник: UITapGestureRecognizer)
Travis M.

Функція виклику повинна бути ................ func handleTap (_ відправник: UITapGestureRecognizer? = Нуль) ............... Ви пропустили "_ "........ тому ваша функція дзвінка не працювала ..
Prasad Patil

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насправді потрібно? за замовчуванням - false?
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.
Pankaj

50

Лише зауваження - не забудьте включити взаємодію в перегляді:

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

view.addGestureRecognizer(tap)

// view.userInteractionEnabled = true

self.view.addSubview(view)

1
Примітка важлива!
Itai Spector

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

Оновлення для 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

Швидкий 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 -> Додати перегляд розкадрування та додати перегляд розеткиController UIView

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

Крок: 2 -> Додати тегу подання перегляду сюжетів

firstView secondView третій перегляд

Крок: 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. Дивись нижче.

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

Якщо ви хочете, щоб об'єктивний код 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

Швидкий 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
Хоча відповідь лише на код - це справді відповідь, трохи пояснень (чому код ОП не працював, яка загальна ідея вашого коду, важливі моменти, попередження ...) може зробити його кращою відповіддю.
lfurini

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

Я хотів уточнити два моменти, які все-таки викликали у мене проблеми.

  • Я створював розпізнавач жестів на init і зберігав його у властивості let. Мабуть, додавання цього розпізнавання жесту до перегляду не працює. Може бути об'єкт "власний", переданий розпізнавальнику жестів під час init, неправильно налаштований.
  • Розпізнавальник жестів не слід додавати до представлень із нульовими кадрами. Я створюю всі свої перегляди з нульовим кадром, а потім змінюю їх розмір за допомогою автоматичного вимикання. Розпізнавачі жестів повинні бути додані ПІСЛЯ перегляду розмірів, які були змінені переглядачами двигуна автолаутера. Тож я додаю розпізнавач жестів у 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
Illya Krit

? IVIEW .addGestureRecognizer (водопровідний) Назва вашої gestureRecognizer є clickUITapGestureRecognizer Так правильний шлях: IVIEW .addGestureRecognizer (clickUITapGestureRecognizer)?
Ілля Krit

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

Ось найпростіший спосіб додати жести на View у 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.