Sự kiện cảm ứng UIView trong bộ điều khiển


95

Làm cách nào để thêm hành động touchbegin UIView hoặc hành động touchhend theo lập trình vì Xcode không cung cấp từ Main.storyboard?


Đó là dành cho nút, OP muốn thêm sự kiện cho UIView
Miknash

Sử dụng a UILongPressGestureRecognizervới minimumPressDurationtập hợp thành 0. Hãy xem câu trả lời này. Nó không yêu cầu phân lớp hoặc ghi đè bất cứ thứ gì.
Suragch

Câu trả lời:


151

Bạn sẽ phải thêm nó thông qua mã. Thử cái này:

    // 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
Tôi đã làm điều đó nhưng nó gây ra lỗi khi tôi nhấp vào uiView. Mã của tôi: let moving = UITapGestureRecognizer (target: self.uiPendingView, action: "touchPending") self.uiPendingView.addGestureRecognizer (cử chỉ) và method: func touchPending (người gửi: AnyObject) {println ("METHOD >>>>>>> >>>>>>>>>> ")}
dhaval shah

1
chỉ cần thêm: trong "touchPending:" trong chức năng nó trông giống như func touchPending (người gửi: UITapGestureRecognizer)
Rizwan Shaikh,

1
bạn đang thiếu ':' trong hành động.
Miknash

Xin chào, Làm cách nào để phân biệt UIView nào đã được nhấp khi tất cả chúng đều có cùng chức năng someAction?
C Williams

Cách đơn giản nhất là nên sử dụng tài sản thẻ và sau đó trong chức năng xác định xem là người gửi
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
}

3
2 DÒNG ĐẦU NÊN ĐƯỢC GỌI TỪ VIEWDIDLOAD!
Oleksandr

24

Cập nhật câu trả lời của @ Crashalot cho 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
    }
}

18

Cập nhật câu trả lời của @ Chackle cho 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
    }
}

8

Đặt cái này vào UIViewlớp con của bạn (dễ nhất là nếu bạn tạo một lớp con cho chức năng này).

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

@Chacle, tôi có hơn 10 Uiview trong trang của mình và tôi muốn thêm hành động vào một số UIView phụ. Vì vậy, những gì tôi nên thay đổi?
dhaval shah

Nó phụ thuộc vào những gì bạn muốn sử dụng nó cho. Bạn muốn cho biết UIViewbạn nhấn cái nào hay bạn muốn xử lý một số lần nhấn trong mỗi cái UIView?
Chackle

Tôi chỉ muốn touchhevent cho một số UIview cụ thể.
dhaval shah

8

Đối với nhanh 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")
}

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
 }

5

Tạo cửa hàng từ các chế độ xem đã được tạo trong StoryBoard.

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

Ghi đè phương thức touchBegan. Có 2 lựa chọn, mọi người có thể xác định cái nào tốt hơn cho mình.

  1. Phát hiện cảm ứng trong chế độ xem đặc biệt.

    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. Phát hiện điểm chạm trên chế độ xem đặc biệt.

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

Cuối cùng, bạn cần khai báo các hàm sẽ được gọi, tùy thuộc vào chế độ xem mà người dùng đã nhấp vào.

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

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

func greenViewTapped() {
    print("greenViewTapped")
}

Rất tốt ví dụ tuyệt vời nhờ chỉ cho tôi !! rằng chúng tôi cũng có thể làm điều này bằng cách sử dụng touchEvent .. tôi chỉ biết nút và cử chỉ hai chiều .. Cảm ơn +1
Yogesh Patel

4

bạn có thể sử dụng theo cách này: tạo tiện ích mở rộng

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
}

và sử dụng theo cách này:

@IBOutlet weak var testView: UIView!
testView.addTapGesture{
   // ...
}

2

Chỉ là bản cập nhật cho các câu trả lời ở trên:

Nếu bạn muốn xem các thay đổi trong sự kiện nhấp chuột, tức là Màu sắc của UIVIew của bạn thay đổi bất cứ khi nào người dùng nhấp vào UIView thì hãy thực hiện các thay đổi như bên dưới ...

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

Ngoài ra, hãy gọi Lớp này từ Storyboard & ViewController là:

@IBOutlet weak var panVerificationUIView:ClickableUIView!

2

Cập nhật câu trả lời của @ stevo.mit cho 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
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.