मैं UIImageView की स्पर्श घटना का पता कैसे लगा सकता हूं


97

मैंने नेविगेशन बार पर एक छवि (UIImageView) रखी है। अब मैं स्पर्श घटना का पता लगाना चाहता हूं और घटना को संभालना चाहता हूं। क्या आप मुझे बता सकते हैं कि मैं ऐसा कैसे कर सकता हूं?

धन्यवाद।


इस स्थिति में मैं (और आपको सोचना चाहिए) इसके बजाय एक कस्टम UIButton का उपयोग करें।
टाइटेनियम

स्विफ्ट संस्करण की जाँच करें उत्तर http://stackoverflow.com/a/41328885/3177007
मोहम्मद जलील नज़ीर

जवाबों:


137

व्यावहारिक रूप में, ऐसा मत करो।

इसके बजाय UIImageView पर कस्टम स्टाइल के साथ एक बटन जोड़ें (कोई भी बटन जब तक आप चित्र निर्दिष्ट न करें)। उसके बाद जो भी तरीके आप चाहते हैं उसे संलग्न करें।

आप कई मामलों के लिए उस तकनीक का उपयोग कर सकते हैं जहां आप वास्तव में स्क्रीन के कुछ क्षेत्र को टच सामान के साथ गड़बड़ करने के बजाय एक बटन के रूप में कार्य करना चाहते हैं।


मैंने नेविगेशन बार में एक बटन जोड़ा है और मैं स्पर्श घटनाओं को भी संभाल सकता हूं। हालांकि, मैं इस बटन पर एक गोल छवि जोड़ना चाहता हूं। क्या आप मुझे बता सकते हैं कि मैं प्रोग्रामेटिक रूप से कैसे कर सकता हूं? इसके अलावा, क्या आप मुझे बता सकते हैं कि मैं प्रोग्रामेटिक रूप से बटन प्रॉपर्टी को "कस्टम" में कैसे सेट कर सकता हूं?
२२

UIButton के लिए डॉक्स को देखें - आपको एक नियंत्रण स्थिति के लिए पृष्ठभूमि चित्र सेट करने की आवश्यकता है, आप सामान्य बनाम चयनित / हाइलाइटेड के लिए अलग-अलग छवियां चाहते हैं। बटन शैली वह है जिसे आपने UIButtonStyleCustom में सेट किया है, मेरा मानना ​​है - फिर से, UIButton पर शैली की संपत्ति के लिए डॉक्स देखें।
केंडल हेल्मसटेटर गेलनर

1
UIImageView के शीर्ष पर एक UIButton नहीं जोड़ रहा है? आप एक अतिरिक्त ऑब्जेक्ट जोड़ रहे हैं, जबकि आप पहले से मौजूद UIImageView ऑब्जेक्ट के स्पर्श विधियों को लागू कर सकते हैं। नहीं?
samvermette

32
यदि आप स्मृति में एक UIButton के आकार को देखते हैं, तो यह वस्तुतः कुछ भी नहीं है और आपके पास केवल कुछ स्क्रीन है। आपको जो भी मुफ्त में मिलता है वह है विभिन्न राज्यों के लिए पूरे टारगेट एक्शन वायरिंग (जैसे कि अंदर टच अप) और साथ ही अच्छा व्यवहार भी जब आप नीचे दबाते हैं तो ट्रिगर नहीं होता है लेकिन एक उंगली को साइड में स्लाइड करें। मूल रूप से बटन पूरे सिस्टम में सबसे सूक्ष्म रूप से गढ़ी गई वस्तुओं में से एक हैं और आपको लगता है कि आप कस्टम टच कोड करने जा रहे हैं जो बेहतर काम करता है वह पागलपन है। उस का उपयोग करें जो सस्ता है और अच्छी तरह से काम करता है, उन चीजों के लिए कस्टम काम को बचाएं जो फ्रेमवर्क आपके लिए पहले से ही संभाल नहीं करते हैं।
केंडल हेल्मसटेटर गेलनर

6
यदि आप सभी की जरूरत स्पर्श घटनाओं (addTaget के माध्यम से: कार्रवाई: forControlEvents :): आप एक UIControl ओवरले कर सकते हैं। यह UIButton की तुलना में थोड़ा सस्ता है जिसमें चित्र और कई राज्य हैं। इसके अलावा, मैं प्रीप्रोसेसर कंडिशनर्स का उपयोग ओवरलेड कंट्रोल के बैकग्राउंड कलर को पिंक में बदलने के लिए करता हूं ताकि मैं ठीक से देख सकूं कि वे कहां हैं (और याद रखें कि वे मौजूद हैं :-)।
जेफ

115

A UIImageViewसे व्युत्पन्न है UIViewजो कि UIResponderस्पर्श घटनाओं को संभालने के लिए तैयार है, इसलिए इससे प्राप्त होता है । आप प्रदान करने के लिए चाहता हूँ touchesBegan, touchesMovedऔर touchesEndedतरीकों और उपयोगकर्ता छवि टैप करता है अगर वे बुलाया प्राप्त करेंगे। यदि आप चाहते हैं कि सभी एक टैप ईवेंट है, तो बस एक कस्टम बटन का उपयोग करना आसान है, जो कि इमेज इमेज के रूप में सेट है। लेकिन अगर आप नल, चाल आदि पर बारीक-बारीक नियंत्रण चाहते हैं, तो यह रास्ता है।

तुम भी कुछ और चीजों को देखना चाहते हो:

  • ओवरराइड canBecomeFirstResponderऔर वापसी YES को इंगित करने के लिए कि दृश्य स्पर्श घटनाओं का फोकस बन सकता है (डिफ़ॉल्ट नहीं है)।

  • userInteractionEnabledसंपत्ति को हां में सेट करें । के लिए डिफ़ॉल्ट UIViewsहां है, लेकिन UIImageViewsनहीं के लिए तो आपको इसे स्पष्ट रूप से चालू करना होगा।

  • यदि आप मल्टी-टच इवेंट्स (जैसे चुटकी, ज़ूम, आदि) का जवाब देना चाहते हैं, तो आप multipleTouchEnabledYES पर सेट करना चाहेंगे ।


मैंने कोशिश की कि लेकिन कभी भी मुझे छुआछूत की घटनाएँ नहीं मिलीं ... ऐसा क्यों है?
मार्कस

5
@ मर्कस: मुझे भी यही समस्या थी, लेकिन इसे userInteractionEnabledमैंने अपने माता-पिता के विचार पर हां में सेट करके तय किया । देखें stackoverflow.com/questions/5887305/…
सेक्सन ड्रूस

51

UIImageView में टच ईवेंट जोड़ने के लिए अपने .m में निम्नलिखित का उपयोग करें

UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)];

[myImageView setUserInteractionEnabled:YES];

[myImageView addGestureRecognizer:newTap];


-(void)myTapMethod{
    // treat image tap
}

उम्मीद है की वो मदद करदे।


userInteractionEnabled = true वह हिस्सा है जिसे भूलना आसान है, धन्यवाद।
माइकल पीटरसन

23

आप एक UIGestureRecognizer भी जोड़ सकते हैं। आपको अपने दृश्य पदानुक्रम में एक अतिरिक्त तत्व जोड़ने की आवश्यकता नहीं है, लेकिन फिर भी आप एक सरल इंटरफ़ेस के साथ स्पर्श घटनाओं को संभालने के लिए सभी अच्छी तरह से लिखे गए कोड प्रदान करेंगे:

    UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc]
                                            initWithTarget:self action:@selector(handleSwipe:)];
    swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
    [imgView_ addGestureRecognizer:swipeRight];        
    [swipeRight release];
    UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc]
                                            initWithTarget:self action:@selector(handleSwipe:)];
    swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
    [imgView_ addGestureRecognizer:swipeLeft];
    [swipeLeft release];

10
यूज़रनेम को निष्क्रिय करना न भूलें। imgView_ के लिए सक्षम किया गया
अनाम व्हाइट

13

मैं पिछले कुछ घंटों से अपनी समस्या का हल खोजने की कोशिश कर रहा हूं, कोई फायदा नहीं हुआ। मैं देखता हूं कि कई देव इस समस्या को साझा करते हैं, और मुझे लगता है कि यहां के लोग इस बारे में जानते हैं। मेरे अंदर एक से अधिक छवियां हैं UIScrollView, उन पर टैप ईवेंट प्राप्त करने की कोशिश कर रहे हैं।

किसी से कोई घटना नहीं मिल रही है UIImangeView, लेकिन मुझे उसी तरह के एक कार्यक्रम से मिलता है, UILableजिसमें बहुत ही समान पैरामीटर हैं जो मैं इसे स्थापित कर रहा हूं। IOS 5.1 के तहत।

मैंने निम्नलिखित कार्य पहले ही कर लिए हैं:

  1. setUserInteractionEn 'YIImageView और मूल दृश्य दोनों के लिए हां में सक्षम है।
  2. सेट के लिए हाँ करने के लिए setMultipleTouchEnabled UIImageView
  3. उपवर्ग की कोशिश की UIImageView, कोई मदद नहीं की।

नीचे दिए गए कुछ कोड अटैच किया जा रहा है, इस कोड में मैं दोनों एक प्रारंभ UIImageViewऔर UILabel, लेबल घटनाओं फायरिंग के मामले में ठीक काम करता है। मैंने अप्रासंगिक कोड रखने की कोशिश की। धन्यवाद दोस्तों, इलान

UIImageView *single_view = [[UIImageView alloc]initWithFrame:CGRectMake(200, 200, 100, 100)];
single_view.image=img;
single_view.layer.zPosition=4;

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)];
[single_view addGestureRecognizer:singleTap];
[single_view setMultipleTouchEnabled:YES];
[single_view setUserInteractionEnabled:YES];
[self.myScrollView addSubview:single_view];    
self.myScrollView.userInteractionEnabled=YES;

UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
testLabel.backgroundColor=[UIColor redColor];
[self.myScrollView addSubview:testLabel];
[testLabel addGestureRecognizer:singleTap];  
[testLabel setMultipleTouchEnabled:YES];
[testLabel setUserInteractionEnabled:YES];
testLabel.layer.zPosition=4;

और विधि जो घटना को संभालती है:

- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{ 
    UIView *tappedView = [gesture.view hitTest:[gesture locationInView:gesture.view] withEvent:nil];
    NSLog(@"Touch event on view: %@",[tappedView class]);
}

जैसा कि कहा गया है, लेबल टैप प्राप्त होता है।


6

UIImageView बनाने के बजाय, फिर इसे नेवबार पर रखकर, आपको बस एक UIBarButtonItem बनाना चाहिए, जिसे आप UIImageView से बनाते हैं।

सबसे पहले चित्र देखें:

UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];

फिर अपने चित्र दृश्य से बारबटन आइटम बनाएं:

UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];

फिर अपने नेविगेशन बार में बार बटन आइटम जोड़ें:

self.navigationItem.rightBarButtonItem = yourBarButtonItem;

याद रखें कि यह कोड व्यू कंट्रोलर में जाता है जो नेविगेशन कंट्रोलर व्यूकंट्रोलर ऐरे के अंदर होता है। तो मूल रूप से, यह "टाउचेबल इमेज-लुकिंग बार बटन आइटम" केवल नेविगेशन बार में दिखाई देगा, जब यह दृश्य नियंत्रक को दिखाया जा रहा है। जब आप किसी अन्य दृश्य नियंत्रक को धक्का देते हैं, तो यह नेविगेशन बार बटन आइटम गायब हो जाएगा ~


3

आप जो करना चाहते हैं touchesBegan:withEvent:, वह UIView(या उपवर्ग) की विधि को ओवरराइड करता है जिसमें आपका UIImageViewसबव्यू होता है।

इस विधि के भीतर, परीक्षण करें कि कोई भी UITouchस्पर्श UIImageViewउदाहरण की सीमा के अंदर आता है (मान लें कि इसे कहा जाता है imageView)।

है यही कारण है, करता है CGPointतत्व [touch locationInView]के साथ साथ एक दूसरे को काटना CGRectतत्व [imageView bounds]? CGRectContainsPointइस परीक्षण को चलाने के लिए फ़ंक्शन देखें ।


आपके जवाब के लिए धन्यवाद। मैंने इस तरह से दृश्य जोड़ा है: [navBar addSubview: self.pImage]; // नेविगेशन बार के एक उप-भाग के रूप में जोड़ा गया। मैंने फ़ंक्शन को ओवरराइड कर दिया है, लेकिन फ़ंक्शन को कभी नहीं बुलाया जाता है। हालांकि मैंने संपत्ति userInteractionEnabled of UIImageView को हां में सेट कर दिया है। क्या मुझे कुछ याद आ रहा है?
एबाकाउंट

टचबैन की जांच करें: रोकें: विधि। यह कैसे काम करता है के खोज इंजन पर बहुत सारे उदाहरण हैं।
एलेक्स रेनॉल्ड्स

1

पहले आपको एक UIButton रखना चाहिए फिर या तो आप इस बटन के लिए बैकग्राउंड इमेज जोड़ें या आपको बटन पर UIImageView रखना होगा।

या

आप UIImageView पर टैप जेस्चर जोड़ सकते हैं ताकि UIImageView पर टैप करने पर क्लिक एक्शन प्राप्त हो सके।


0

आप में से जो इस जवाब के लिए एक स्विफ्ट 4 समाधान की तलाश कर रहे हैं। आप UIImageView पर एक टच ईवेंट का पता लगाने के लिए निम्नलिखित का उपयोग कर सकते हैं।

let gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
imageView.addGestureRecognizer(gestureRecognizer)
imageView.isUserInteractionEnabled = true

फिर आपको अपने चयनकर्ता को इस प्रकार परिभाषित करना होगा:

@objc func imageViewTapped() {
    // Image has been tapped
}

-2

उस दृश्य पर इशारा जोड़ें। उस दृश्य में एडिट छवि तब भी छवि पर इशारे का पता लगाना होगा। यदि आप स्पर्श घटना के प्रतिनिधि विधि के साथ प्रयास करते हैं, तो उस स्थिति में भी यह पता लगा सकता है। धन्यवाद

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