Événement tactile UIView dans le contrôleur

95

Comment puis-je ajouter une action UIView touchbegin ou une action touchend par programmation car Xcode ne fournit pas de Main.storyboard?

dhaval shah
la source
Celui-ci est pour le bouton, l'OP veut ajouter un événement pour UIView
Miknash
Utilisez a UILongPressGestureRecognizeravec la valeur minimumPressDurationzéro. Voyez cette réponse. Il ne nécessite aucun sous-classement ni aucun remplacement.
Suragch

Réponses:

151

Vous devrez l'ajouter via le code. Essaye ça:

    // 1.create UIView programmetically
    var myView = UIView(frame: CGRectMake(100, 100, 100, 100))
    // 2.add myView to UIView hierarchy
    self.view.addSubview(myView) 
    // 3. add action to myView
    let gesture = UITapGestureRecognizer(target: self, action: "someAction:")
    // or for swift 2 +
    let gestureSwift2AndHigher = UITapGestureRecognizer(target: self, action:  #selector (self.someAction (_:)))
    self.myView.addGestureRecognizer(gesture)

    func someAction(sender:UITapGestureRecognizer){     
       // do other task
    }

    // or for Swift 3
    func someAction(_ sender:UITapGestureRecognizer){     
       // do other task
    }

    // or for Swift 4
    @objc func someAction(_ sender:UITapGestureRecognizer){     
       // do other task
    }

    // update for Swift UI

    Text("Tap me!")
        .tapAction {
             print("Tapped!")
        }
Miknash
la source
1
J'ai fait que cela me donne une erreur lorsque je clique sur uiView. Mon code: let gesture = UITapGestureRecognizer (cible: self.uiPendingView, action: "touchPending") self.uiPendingView.addGestureRecognizer (geste) et méthode: func touchPending (expéditeur: AnyObject) {println ("METHOD >>>>>>> >>>>>>>>>> ")}
dhaval shah
1
il suffit d'ajouter: dans "touchPending:" et en fonction, cela ressemble à func touchPending (expéditeur: UITapGestureRecognizer)
Rizwan Shaikh
1
il vous manque «:» en action.
Miknash
Salut, Comment puis-je distinguer quel UIView a été cliqué quand ils ont tous la même fonction someAction?
C Williams
Le moyen le plus simple serait d'utiliser la propriété de la balise, puis dans la fonction de déterminer quelle vue est l'expéditeur
Miknash
68

Swift 4/5:

let gesture = UITapGestureRecognizer(target: self, action:  #selector(self.checkAction))
self.myView.addGestureRecognizer(gesture)

@objc func checkAction(sender : UITapGestureRecognizer) {
    // Do what you want
}

Swift 3:

let gesture = UITapGestureRecognizer(target: self, action:  #selector(self.checkAction(sender:)))
self.myView.addGestureRecognizer(gesture)

func checkAction(sender : UITapGestureRecognizer) {
    // Do what you want
}
ventuz
la source
3
LES 2 PREMIÈRES LIGNES DOIVENT ÊTRE APPELÉES À PARTIR DE VIEWDIDLOAD!
Oleksandr
24

Mise à jour de la réponse de @ Crashalot pour Swift 3.x:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        let currentPoint = touch.location(in: self)
        // do something with your currentPoint
    }
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        let currentPoint = touch.location(in: self)
        // do something with your currentPoint
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        let currentPoint = touch.location(in: self)
        // do something with your currentPoint
    }
}
stevo.mit
la source
18

Mise à jour de la réponse de @ Chackle pour Swift 2.x:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    if let touch = touches.first {
        let currentPoint = touch.locationInView(self)
        // do something with your currentPoint
    }
}

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    if let touch = touches.first {
        let currentPoint = touch.locationInView(self)
        // do something with your currentPoint
    }
}

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    if let touch = touches.first {
        let currentPoint = touch.locationInView(self)
        // do something with your currentPoint
    }
}
Crashalot
la source
8

Mettez ceci dans votre UIViewsous - classe (c'est plus simple si vous créez une sous-classe pour cette fonctionnalité).

class YourView: UIView {

  //Define your initialisers here

  override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    if let touch = touches.first as? UITouch {
      let currentPoint = touch.locationInView(self)
      // do something with your currentPoint
    }
  }

  override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
    if let touch = touches.first as? UITouch {
      let currentPoint = touch.locationInView(self)
      // do something with your currentPoint
    }
  }

  override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
    if let touch = touches.first as? UITouch {
      let currentPoint = touch.locationInView(self)
      // do something with your currentPoint
    }
  }
}
Chackle
la source
@Chacle, j'ai plus de 10 Uiview dans ma page et je veux ajouter une action dans certains Sub UIView. Alors, que dois-je changer?
dhaval shah
Cela dépend de l'utilisation que vous en faites. Voulez-vous dire sur lequel UIViewvous appuyez ou voulez-vous gérer certaines presses dans chacun des UIView?
Chackle
Je veux touchevent pour certaines UIview spécifiques uniquement.
dhaval shah
8

Pour Swift 4

@IBOutlet weak var someView: UIView!  
let gesture = UITapGestureRecognizer(target: self, action:  #selector (self.someAction (_:)))
self.someView.addGestureRecognizer(gesture)

@objc func someAction(_ sender:UITapGestureRecognizer){
    print("view was clicked")
}
DevB2F
la source
5

Swift 4.2:

@IBOutlet weak var viewLabel1: UIView!
@IBOutlet weak var viewLabel2: UIView!
  override func viewDidLoad() {
    super.viewDidLoad()

    let myView = UITapGestureRecognizer(target: self, action: #selector(someAction(_:)))
    self.viewLabel1.addGestureRecognizer(myView)
}

 @objc func someAction(_ sender:UITapGestureRecognizer){
   viewLabel2.isHidden = true
 }
Salut Đỗ
la source
5

Créez des points de vente à partir de vues créées dans StoryBoard.

@IBOutlet weak var redView: UIView!
@IBOutlet weak var orangeView: UIView!
@IBOutlet weak var greenView: UIView!   

Remplacez la méthode touchesBegan. Il y a 2 options, chacun peut déterminer laquelle est la meilleure pour lui.

  1. Détecter le toucher dans une vue spéciale.

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
         if let touch = touches.first {
            if touch.view == self.redView {
                tapOnredViewTapped()
            } else if touch.view == self.orangeView {
                orangeViewTapped()
            } else if touch.view == self.greenView {
                greenViewTapped()
            } else {
                return
            }
        }
    
    }
  2. Détectez le point de contact sur une vue spéciale.

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let touch = touches.first {
            let location = touch.location(in: view)
            if redView.frame.contains(location) {
                redViewTapped()
            } else if orangeView.frame.contains(location) {
                orangeViewTapped()
            } else if greenView.frame.contains(location) {
                greenViewTapped()
            }
        }
    
    }

Enfin, vous devez déclarer les fonctions qui seront appelées, en fonction de la vue sur laquelle l'utilisateur a cliqué.

func redViewTapped() {
    print("redViewTapped")
}

func orangeViewTapped() {
    print("orangeViewTapped")
}

func greenViewTapped() {
    print("greenViewTapped")
}
iAleksandr
la source
Très bien excellent exemple grâce à me montrer !! que nous pouvons également le faire en utilisant touchEvent .. je ne connais que le bouton et le geste bidirectionnels .. Merci +1
Yogesh Patel
4

vous pouvez utiliser cette façon: créer une extension

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
}

et utilisez de cette façon:

@IBOutlet weak var testView: UIView!
testView.addTapGesture{
   // ...
}
Rasoul Miri
la source
2

Juste une mise à jour des réponses ci-dessus:

Si vous voulez voir les changements dans l'événement de clic, c'est-à-dire que la couleur de votre UIVIew shud change chaque fois que l'utilisateur clique sur l'UIView, puis effectuez les modifications comme ci-dessous ...

class ClickableUIView: UIView {
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
            if let touch = touches.first {
                let currentPoint = touch.locationInView(self)
                // do something with your currentPoint
            }

            self.backgroundColor = UIColor.magentaColor()//Color when UIView is clicked.
        }

        override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
            if let touch = touches.first {
                let currentPoint = touch.locationInView(self)
                // do something with your currentPoint
            }

            self.backgroundColor = UIColor.magentaColor()//Color when UIView is clicked.
        }

        override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
            if let touch = touches.first {
                let currentPoint = touch.locationInView(self)
                // do something with your currentPoint
            }

            self.backgroundColor = UIColor.whiteColor()//Color when UIView is not clicked.

}//class closes here

Appelez également cette classe à partir de Storyboard & ViewController comme:

@IBOutlet weak var panVerificationUIView:ClickableUIView!
Pawan
la source
2

Mise à jour de la réponse de @ stevo.mit pour Swift 4.x:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        let currentPoint = touch.location(in: self.view)
        // do something with your currentPoint
    }
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        let currentPoint = touch.location(in: self.view)
        // do something with your currentPoint
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        let currentPoint = touch.location(in: self.view)
        // do something with your currentPoint
    }
}
Jacob Ahlberg
la source