Как я могу программно добавить действие touchbegin или touchbegin UIView, поскольку Xcode не предоставляет из Main.storyboard?
ios
swift
uiview
uiviewcontroller
Дхавал Шах
источник
источник
UILongPressGestureRecognizer
сminimumPressDuration
нулевым значением. Смотрите этот ответ. Он не требует создания подклассов или переопределения чего-либо.Ответы:
Вам нужно будет добавить его через код. Попробуй это:
// 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!") }
источник
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 }
источник
Обновление ответа @ Crashalot для 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 } }
источник
Обновление ответа @Chackle для 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 } }
источник
Поместите это в свой
UIView
подкласс (проще всего, если вы сделаете подкласс для этой функции).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 } } }
источник
UIView
нажимаете, или хотите обработать несколько прессов в каждом из нихUIView
?Для 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") }
источник
Создавайте выходы из представлений, созданных в StoryBoard.
@IBOutlet weak var redView: UIView! @IBOutlet weak var orangeView: UIView! @IBOutlet weak var greenView: UIView!
Переопределите метод touchesBegan. Есть 2 варианта, каждый может определить, какой ему лучше.
Обнаружение касания в специальном режиме просмотра.
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 } } }
Обнаружение точки касания на специальном экране.
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() } } }
Наконец, вам нужно объявить функции, которые будут вызываться в зависимости от того, на каком представлении щелкнул пользователь.
func redViewTapped() { print("redViewTapped") } func orangeViewTapped() { print("orangeViewTapped") } func greenViewTapped() { print("greenViewTapped") }
источник
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 }
источник
можно использовать так: создать расширение
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 }
и используйте так:
@IBOutlet weak var testView: UIView! testView.addTapGesture{ // ... }
источник
Просто обновление для приведенных выше ответов:
Если вы хотите видеть изменения в событии щелчка, т.е. цвет вашего UIVIew shud меняется всякий раз, когда пользователь нажимает на UIView, тогда внесите изменения, как показано ниже ...
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
Также вызовите этот класс из раскадровки и ViewController как:
@IBOutlet weak var panVerificationUIView:ClickableUIView!
источник
Обновление ответа @ stevo.mit для 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 } }
источник