Событие касания UIView в контроллере

98

Как я могу программно добавить действие touchbegin или touchbegin UIView, поскольку Xcode не предоставляет из Main.storyboard?

Дхавал Шах
источник
Это для кнопки, OP хочет добавить событие для UIView
Микнаш
Используйте a UILongPressGestureRecognizerс minimumPressDurationнулевым значением. Смотрите этот ответ. Он не требует создания подклассов или переопределения чего-либо.
Suragch 01

Ответы:

151

Вам нужно будет добавить его через код. Попробуй это:

    // 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!")
        }
Микнаш
источник
1
Я сделал это, когда я нажимаю на uiView, у меня возникает ошибка. Мой код: let gesture = UITapGestureRecognizer (target: self.uiPendingView, action: "touchPending") self.uiPendingView.addGestureRecognizer (жест) и метод: func touchPending (отправитель: AnyObject) {println ("МЕТОД >>>>>>> >>>>>>>>>> ")}
дхавал шах
1
просто добавьте: в «touchPending:» и в функции это выглядит как func touchPending (отправитель: UITapGestureRecognizer)
Ризван Шейх
1
вам не хватает ":" в действии.
Микнаш
Привет! Как я могу определить, какой UIView был нажат, если все они имеют одинаковую функцию someAction?
C Williams
Самый простой способ - использовать свойство тега, а затем в функции определить, какое представление является отправителем
Микнаш
72

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
}
Вентуц
источник
4
ПЕРВЫЕ 2 ЛИНИИ ДОЛЖНЫ ВЫЗЫВАТЬСЯ ИЗ VIEWDIDLOAD!
Александр
25

Обновление ответа @ 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
    }
}
stevo.mit
источник
19

Обновление ответа @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
    }
}
Crashalot
источник
8

Поместите это в свой 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
    }
  }
}
Chackle
источник
@Chacle, у меня на странице более 10 Uiview, и я хочу добавить действие в некоторые из Sub UIView. Итак, что мне для этого нужно изменить?
дхавал шах
Это зависит от того, для чего вы хотите его использовать. Вы хотите сказать, что UIViewнажимаете, или хотите обработать несколько прессов в каждом из них UIView?
Chackle
Я хочу touchevent только для некоторых конкретных UIview.
дхавал шах
8

Для 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
источник
6

Создавайте выходы из представлений, созданных в StoryBoard.

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

Переопределите метод touchesBegan. Есть 2 варианта, каждый может определить, какой ему лучше.

  1. Обнаружение касания в специальном режиме просмотра.

    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. Обнаружение точки касания на специальном экране.

    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")
}
iAleksandr
источник
Отличный пример, спасибо, что показал мне !! что мы также можем сделать это с помощью touchEvent .. я знаю только двустороннюю кнопку и жест .. Спасибо +1
Йогеш Патель
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
 }
Hiền
источник
4

можно использовать так: создать расширение

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{
   // ...
}
Расул Мири
источник
2

Просто обновление для приведенных выше ответов:

Если вы хотите видеть изменения в событии щелчка, т.е. цвет вашего 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!
Pawan
источник
2

Обновление ответа @ 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
    }
}
Якоб Альберг
источник