Jak mogę programowo dodać akcję touchbegin UIView lub akcję touchend, ponieważ Xcode nie zapewnia z Main.storyboard?
ios
swift
uiview
uiviewcontroller
dhaval shah
źródło
źródło
UILongPressGestureRecognizer
zminimumPressDuration
ustawieniem na zero. Zobacz tę odpowiedź. Nie wymaga tworzenia podklas ani nadpisywania czegokolwiek.Odpowiedzi:
Będziesz musiał dodać go za pomocą kodu. Spróbuj tego:
// 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!") }
źródło
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 }
źródło
Aktualizacja odpowiedzi @ Crashalot dla 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 } }
źródło
Aktualizacja odpowiedzi @ Chackle dla 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 } }
źródło
Umieść to w swojej
UIView
podklasie (najłatwiej jest zrobić podklasę dla tej funkcjonalności).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 } } }
źródło
UIView
naciśniesz, czy chcesz obsłużyć kilka pras w każdym zUIView
?Dla szybkiego 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") }
źródło
Twórz punkty sprzedaży na podstawie widoków utworzonych w StoryBoard.
@IBOutlet weak var redView: UIView! @IBOutlet weak var orangeView: UIView! @IBOutlet weak var greenView: UIView!
Zastąp metodę dotknięćBegan. Istnieją 2 opcje, każdy może określić, która z nich jest dla niego lepsza.
Wykryj dotyk w specjalnym widoku.
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 } } }
Wykryj punkt dotyku na specjalnym widoku.
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() } } }
Na koniec musisz zadeklarować funkcje, które będą wywoływane, w zależności od tego, który widok kliknął użytkownik.
func redViewTapped() { print("redViewTapped") } func orangeViewTapped() { print("orangeViewTapped") } func greenViewTapped() { print("greenViewTapped") }
źródło
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 }
źródło
możesz użyć w ten sposób: utwórz rozszerzenie
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 }
i użyj w ten sposób:
@IBOutlet weak var testView: UIView! testView.addTapGesture{ // ... }
źródło
Tylko aktualizacja powyższych odpowiedzi:
Jeśli chcesz zobaczyć zmiany w zdarzeniu kliknięcia, tj. Kolor Twojego UIVIew zmieni się za każdym razem, gdy użytkownik kliknie UIView, wprowadź zmiany jak poniżej ...
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
Wywołaj również tę klasę z Storyboard & ViewController jako:
@IBOutlet weak var panVerificationUIView:ClickableUIView!
źródło
Aktualizacja odpowiedzi @ stevo.mit dla 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 } }
źródło