컨트롤러의 UIView 터치 이벤트


95

Xcode가 Main.storyboard에서 제공하지 않으므로 프로그래밍 방식으로 UIView touchbegin 작업 또는 touchend 작업을 추가하려면 어떻게해야합니까?


하나는 버튼, OP는 UIView에 대한 이벤트를 추가하려고합니다
Miknash

를 사용 UILongPressGestureRecognizerminimumPressDuration영 (0)으로 설정하십시오. 이 답변을 참조하십시오. 서브 클래 싱이나 재정의가 필요하지 않습니다.
Suragch

답변:


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 (gesture) and method : func touchPending (sender : AnyObject) {println ( "METHOD >>>>>>> >>>>>>>>>> ")}
dhaval 샤

1
그냥 추가하십시오 : "touchPending :"함수에서 그것은 func touchPending (sender : UITapGestureRecognizer)처럼 보입니다
Rizwan Shaikh

1
':'이 누락되었습니다.
Miknash

안녕하세요, 모든 UIView가 동일한 someAction 함수를 가지고있을 때 클릭 된 UIView를 어떻게 구별 할 수 있습니까?
C Williams

가장 쉬운 방법은 태그의 속성을 사용하는 다음 기능에 보낸되는보기 결정할 것
Miknash

68

스위프트 4/5 :

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

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

스위프트 3 :

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

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

3
VIEWDIDLOAD에서 처음 2 개 라인을 호출해야합니다!
Oleksandr

24

Swift 3.x에 대한 @Crashalot의 답변 업데이트 :

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

Swift 2.x에 대한 @Chackle의 답변 업데이트 :

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

이것을 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
    }
  }
}

@Chacle, 내 페이지에 10 개 이상의 Uiview가 있으며 일부 하위 UIView에 작업을 추가하고 싶습니다. 그래서 내가 무엇을 변경해야합니까?
dhaval shah

사용하려는 용도에 따라 다릅니다. UIView어떤 프레스를 누르 는지 말하고 싶 UIView습니까? 아니면 각각의 프레스를 처리 하시겠습니까?
Chackle

특정 UIview에만 터치 이벤트를 원합니다.
dhaval shah

8

신속한 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

StoryBoard에서 만든보기에서 콘센트를 만듭니다.

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

touchesBegan 메서드를 재정의합니다. 두 가지 옵션이 있으며 모든 사람이 어느 것이 더 나은지 결정할 수 있습니다.

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

보여 주셔서 아주 좋은 예 !! touchEvent를 사용하여이 작업을 수행 할 수도 있습니다 .. 양방향 버튼과 제스처 만 알고 있습니다. 감사합니다 +1
Yogesh Patel

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를 클릭 할 때마다 UIVI의 색상이 변경된 다음 아래와 같이 변경합니다.

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

또한 Storyboard 및 ViewController에서이 클래스를 다음과 같이 호출합니다.

@IBOutlet weak var panVerificationUIView:ClickableUIView!

2

Swift 4.x에 대한 @ stevo.mit의 답변 업데이트 :

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
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.