स्विफ्ट में UIImageView ऑब्जेक्ट के लिए एक एक्शन कैसे असाइन करें


186

UIImageViewजब उपयोगकर्ता टैप करता है तो मैं उसे एक्शन असाइन करने का प्रयास कर रहा हूं ।

मुझे पता है कि ए के लिए एक एक्शन कैसे बनाया जाता है UIButton, लेकिन मैं एक के एक ही व्यवहार की नकल कैसे कर सकता हूं UIButton, लेकिन एक का उपयोग करके UIImageView?

जवाबों:


421

तुम एक की आवश्यकता होगी UITapGestureRecognizer। इसका उपयोग सेट करने के लिए:

override func viewDidLoad()
{
    super.viewDidLoad()

    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
    imageView.isUserInteractionEnabled = true
    imageView.addGestureRecognizer(tapGestureRecognizer)
}

@objc func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
{
    let tappedImage = tapGestureRecognizer.view as! UIImageView

    // Your action
}

(आप UIButtonपाठ के बिना और केवल कनेक्ट करने के लिए, एक छवि का उपयोग कर सकते हैं और इसे असाइन कर सकते हैं IBAction)


3
नाइटपिक: var tgr = UITapGestureRecognizer (लक्ष्य: स्वयं क्रिया: चयनकर्ता ("imageTapped:")), दो मापदंडों के बीच अल्पविराम की आवश्यकता है।
स्यूसियर

3
के रूप में MidHun सांसद द्वारा नीचे बताया गया है, आप userInteractionEnabled = सच है सुनिश्चित करें
Sheraz

2
स्विफ्ट 3.0 में एक्शन का सिंटैक्स: चयनकर्ता ("इमेजटैप्ड:") एक्शन में बदल गया: #selector (इमेजटैप्ड)
एमिली

2
इसके अलावा स्विफ्ट 3.0 में userInteractionEnabled संपत्ति का नाम बदलकर isUserInteractionEnabled किया गया है
डग एमोस

2
स्विफ्ट 4 का उपयोग करते हुए, इसने मेरे लिए काम किया, लेकिन मुझे @objcफ़ंक्शन में एक संशोधक जोड़ना पड़ा ।
मार्क

68

आप (के लिए नल उपयोग आ इशारा पहचानकर्ता जोड़ने की जरूरत है UITapGestureRecognizer नल और पकड़ उपयोग के लिए, UILongPressGestureRecognizer अपने लिए) UIImageView

let tap = UITapGestureRecognizer(target: self, action: #selector(YourClass.tappedMe))
imageView.addGestureRecognizer(tap)
imageView.isUserInteractionEnabled = true

और चयनकर्ता विधि को लागू करें जैसे:

@objc func tappedMe()
{
    println("Tapped on Image")
}

13
userInteractionEnabled कुंजी है।
kennydust

@ शतीम: आप किस मुद्दे का सामना कर रहे हैं? यदि आपके पास कोई नया मुद्दा है, तो कृपया इसे एक नए प्रश्न के रूप में पोस्ट करें।
मिडहुन एमपी

@MidhunMP मैं छवि दृश्य गतिशील पैदा कर रहा हूँ और किया है कि वास्तव में क्या इस उत्तर लेकिन tappedMe () फ़ंक्शन में लिखा है नहीं बुलाया जा रहा है
हातिम

1
इसने मेरे लिए निम्न बदलावों के साथ काम किया: टैप करें = UITapGestureRecognizer (लक्ष्य: स्वयं, क्रिया: #selector (ViewController.tappedMe)) // अगली पंक्ति -> successIndicatorImg .addGestureRecognizer (टैप) // अगली पंक्ति -> successIndicatorImg.serUserUser.inter सच
अल्मीर कैम्पोस

@ क्या आप कई यूआई विचारों के लिए एक ही इशारे का उपयोग कर रहे हैं? मैंने अभी इस मुद्दे को हल किया है क्योंकि मैं कई विचारों के लिए एक ही इशारे का उपयोग कर रहा था और केवल एक ही मेरे लिए काम कर रहा था। जब मैंने कई इशारे बनाए तो यह मेरे लिए काम किया।
नदाफफिफ़

36

आप UITapGestureRecognizerइमेज व्यू में जोड़ सकते हैं , बस अपने स्टोरीबोर्ड / xib में एक को खींचें, इमेज व्यू से जेस्चरुराइज़र पर Ctrl-खींचें और एक बनाने के लिए जेस्चर-इंक्वाइज़र से स्विफ्ट-फाइल में Ctrl-खींचें IBAction

UIImageViewजैसा कि इस चित्र में दिखाया गया है, आपको उपयोगकर्ता के इंटरैक्शन को सक्षम करने की आवश्यकता होगी : यहां छवि विवरण दर्ज करें


4
UIImageViewडिफ़ॉल्ट रूप से स्पर्श का जवाब नहीं देता है। आपको उपयोगकर्ता इंटरैक्शन को भी सक्षम करना होगा।
रामादेवी

@ श्रमी ऊप्स, यह सच है। संपादित।
एमिल

1
मुझे पसंद है कि आप आईबी का उपयोग करके इसे कैसे सेट कर सकते हैं, ड्रैग / ड्रॉप शक्तिशाली है, और उम्मीद नहीं थी कि यह संभव था। उसके लिए +1। एक नॉब के रूप में, यह जानना आसान नहीं होगा कि यह स्टोरीबोर्ड के चारों ओर "मूसिंग" के बिना कैसे जुड़ा हुआ है। यह आपकी पसंद पर निर्भर करता है, लेकिन मैं इसे "कोड में देखना" पसंद करता हूं।
क्रोधितगीत

13

तेजी के लिए 2.0 और इसके बाद के संस्करण ऐसा करते हैं

@IBOutlet weak var imageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let tap = UITapGestureRecognizer(target: self, action: #selector(ViewController.tappedMe))
        imageView.addGestureRecognizer(tap)
        imageView.userInteractionEnabled = true
    }
    func tappedMe()
    {
        print("Tapped on Image")
    }

userInteractionEnabled का अब नाम बदलकर isUserInteractionEnabled कर दिया गया है
चैम फ्राइडमैन

11

स्विफ्ट 4 कोड

यह कुछ नई एक्सटेंशन विधियाँ आज़माएँ:

import UIKit

extension UIView {

    fileprivate struct AssociatedObjectKeys {
        static var tapGestureRecognizer = "MediaViewerAssociatedObjectKey_mediaViewer"
    }

    fileprivate typealias Action = (() -> Void)?


    fileprivate var tapGestureRecognizerAction: Action? {
        set {
            if let newValue = newValue {
                // Computed properties get stored as associated objects
                objc_setAssociatedObject(self, &AssociatedObjectKeys.tapGestureRecognizer, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
            }
        }
        get {
            let tapGestureRecognizerActionInstance = objc_getAssociatedObject(self, &AssociatedObjectKeys.tapGestureRecognizer) as? Action
            return tapGestureRecognizerActionInstance
        }
    }


    public func addTapGestureRecognizer(action: (() -> Void)?) {
        self.isUserInteractionEnabled = true
        self.tapGestureRecognizerAction = action
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTapGesture))
        self.addGestureRecognizer(tapGestureRecognizer)
    }


    @objc fileprivate func handleTapGesture(sender: UITapGestureRecognizer) {
        if let action = self.tapGestureRecognizerAction {
            action?()
        } else {
            print("no action")
        }
    }

}

अब जब भी हम UITapGestureRecognizerएक UIViewया एक UIViewउपवर्ग की तरह जोड़ना चाहते हैंUIImageView , तो हम चयनकर्ताओं के लिए संबंधित कार्य किए बिना ऐसा कर सकते हैं!

उपयोग:

 profile_ImageView.addTapGestureRecognizer {
        print("image tapped")
    }

2
बहुत अच्छा काम करता है। और इसने कार्यान्वयन को बहुत सरल बना दिया।
निक एन

उपयोग किए गए प्रतिबिंब कार्यों से मुझे थोड़ा डराता है - क्या यह भविष्य के स्विफ्ट संस्करणों में काम करने का अच्छा मौका है?
केलेअकाइद

1
यह बहुत ही सुरुचिपूर्ण और सहायक है। मेरे लिए काम करता है
टेलर मैक्सवेल

2
:मुझे प्यार एक्सटेंशन
रिकार्डो

8

आप वास्तव में बस की छवि सेट कर सकते हैं UIButtonजो आप सामान्य रूप से डालते हैं UIImageView। उदाहरण के लिए, आप कहां करेंगे:

myImageView.image = myUIImage

आप इसके बजाय उपयोग कर सकते हैं:

myButton.setImage(myUIImage, forState: UIControlState.Normal)

तो, यहां आपका कोड कैसा दिख सकता है:

override func viewDidLoad(){
  super.viewDidLoad()

  var myUIImage: UIImage //set the UIImage here
  myButton.setImage(myUIImage, forState: UIControlState.Normal)
}

@IBOutlet var myButton: UIButton!
@IBAction func buttonTap(sender: UIButton!){
  //handle the image tap
}

इस विधि का उपयोग करने के बारे में महान बात यह है कि अगर आपको किसी डेटाबेस से छवि को लोड करना है, तो आप छवि सेट करने से पहले बटन का शीर्षक निर्धारित कर सकते हैं:

myButton.setTitle("Loading Image...", forState: UIControlState.Normal)

अपने उपयोगकर्ताओं को यह बताने के लिए कि आप छवि लोड कर रहे हैं


2


UGapGestureRecognizer (लक्ष्य: स्वयं ...) में 'स्व' के बाद से रजिस्टर करने के लिए TapGestureRecognizer के लिए आलसी को जोड़ने की आवश्यकता है यदि यह आलसी नहीं है। भले ही आप सेट isUserInteractionEnable = true है, यह आलसी वर्जन के बिना रजिस्टर नहीं होगा।

lazy var imageSelector : UIImageView = {
    let image = UIImageView(image: "imageName.png")
    //now add tap gesture
    image.isUserInteractionEnabled = true
    image.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleImageSelector)))
    return image
}()
@objc private func handleImageSelector() {
    print("Pressed image selector")
}

1

आप UIButtonऊपर की ओर पारदर्शी पृष्ठभूमि के साथ रख सकते हैं UIImageView, और छवि को लोड करने से पहले बटन पर टैप के लिए सुन सकते हैं


1
एक विकल्प का वर्णन करने का यह एक तेज़ तरीका है। मैंने सोचा की हर किसी को यह पता था!
5

3
बिना किसी वास्तविक कारण के अनावश्यक यूआई घटकों को जोड़ना एक अच्छा विचार नहीं है। यह UI की जटिलता को बढ़ाएगा और आपको समान ऑटो लेआउट बाधाओं से भी निपटना होगा। केवल TapGestureRecognizer जोड़ना बेहतर है।
गुंजन

1

स्विफ्ट 4 कोड


चरण 1 में ViewdidLoad ()

   let pictureTap = UITapGestureRecognizer(target: self, action: #selector(MyInfoTableViewController.imageTapped))
       userImageView.addGestureRecognizer(pictureTap)
       userImageView.isUserInteractionEnabled = true

चरण 2 निम्नलिखित फ़ंक्शन जोड़ें

@objc func imageTapped() {

        let imageView = userImageView
        let newImageView = UIImageView(image: imageView?.image)
        newImageView.frame = UIScreen.main.bounds
        newImageView.backgroundColor = UIColor.black
        newImageView.contentMode = .scaleAspectFit
        newImageView.isUserInteractionEnabled = true
        let tap = UITapGestureRecognizer(target: self, action: #selector(dismissFullscreenImage))
        newImageView.addGestureRecognizer(tap)
        self.view.addSubview(newImageView)

        self.navigationController?.isNavigationBarHidden = true
        self.tabBarController?.tabBar.isHidden = true

    }

यह परीक्षण किया है और ठीक से काम कर रहा है


0

मैं आपके चित्र पर अदृश्य (अस्पष्टता = 0) बटन रखने का सुझाव देता हूं और फिर बटन पर इंटरैक्शन संभालता हूं।

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