नियंत्रक में UIView स्पर्श घटना


94

मैं UIView टचबेगिन एक्शन को कैसे जोड़ सकता हूं या प्रोग्राम एक्शन को टच कर सकता हूं क्योंकि Xcode Main.storyboard से प्रदान नहीं कर रहा है?


यह एक बटन के लिए है, ओपी
उविवि के

सेट के UILongPressGestureRecognizerसाथ प्रयोग करें minimumPressDurationशून्य पर। इस जवाब को देखें। इसमें किसी भी चीज़ को ओवरक्लास करने या ओवरराइड करने की आवश्यकता नहीं होती है।
सूर्याग

जवाबों:


150

आपको इसे कोड के माध्यम से जोड़ना होगा। इसे इस्तेमाल करे:

    // 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 पर क्लिक करता हूं तो यह मुझे एक त्रुटि दे रहा है। मेरा कोड: जेस्चर = UITapGestureRecognizer (लक्ष्य: self.uiPendingView, कार्रवाई: "टचपेंडिंग") self.uiPendingView.addGestureRecognizer (इशारा) और विधि और फ़ोक टचिंग (प्रेषक: AnyObject) {Println ("METHOD >>>>>>> >>>>>>>>>> ")}
dhaval shah

1
बस जोड़ें: "टचपेंडिंग:" एन्स इन फंक्शन में यह फंक टचिंग की तरह दिखता है (प्रेषक: UITapGestureRecognizer)
शेख

1
आप कार्रवाई में ':' याद कर रहे हैं।
मिकनाश

नमस्ते, मैं कैसे भेद कर सकता हूं जो यूआईवीवाई ने क्लिक किया है जब वे सभी एक ही समारोह में हैं?
सी विलियम्स

सबसे आसान तरीका यह होगा कि टैग प्रॉपर्टी का उपयोग किया जाए और फिर फंक्शन में यह निर्धारित किया जाए कि कौन सा दृश्य प्रेषक है
मिकाँश

65

स्विफ्ट 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 लाइन दूर होनी चाहिए!
ओलेकेंडर

23

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

17

स्विफ्ट 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
    }
}

7

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

@ चाचा, मेरे पेज में 10 से अधिक Uiview हैं, और मैं कुछ सब UIView में कार्रवाई जोड़ना चाहता हूं। तो उसके लिए मुझे क्या बदलना चाहिए?
धवल शाह

यह निर्भर करता है कि आप इसके लिए क्या उपयोग करना चाहते हैं। क्या आप यह बताना चाहते हैं कि UIViewआप कौन सा प्रेस करते हैं या आप प्रत्येक में कुछ प्रेस को संभालना चाहते हैं UIView?
चकेले

मैं केवल कुछ विशिष्ट UIview के लिए स्पर्श चाहता हूं।
धवल शाह

7

स्विफ्ट 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")
}

4

स्विफ्ट 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
 }

4

StoryBoard में बनाए गए विचारों से आउटलेट बनाएं।

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

टचबेस विधि को ओवरराइड करें। 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")
}

बहुत अच्छा उदाहरण मुझे दिखाने के लिए धन्यवाद !! कि हम भी टच का उपयोग कर ऐसा कर सकते हैं .. मैं केवल दो तरह से बटन और इशारा जानते हैं .. धन्यवाद +1
योगेश पटेल

3

आप इस तरह से उपयोग कर सकते हैं: एक्सटेंशन बनाएं

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{
   // ...
}

1

उपरोक्त उत्तर के लिए बस एक अद्यतन:

यदि आप क्लिक इवेंट में परिवर्तन देखना चाहते हैं, अर्थात आपके UIVIew का रंग बदल जाता है जब भी उपयोगकर्ता 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!

1

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
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.