2010-03-29 13 views
14

मैं यह निर्धारित करने की कोशिश कर रहा हूं कि क्या UILabel को छुआ था और यदि ऐसा कुछ है। दें ..मैं कैसे निर्धारित कर सकता हूं कि UILabel को छुआ था या नहीं?

. 
. 
. 
UILabel * site = [[UILabel alloc] initWithFrame:CGRectMake(0, 185, 320, 30)]; 
site.text = [retriever.plistDict valueForKey:@"url"]; 
site.textAlignment =UITextAlignmentCenter; 
site.backgroundColor = [UIColor clearColor]; 
site.textColor = [UIColor whiteColor]; 
site.userInteractionEnabled = YES; 
[theBgView addSubview:site]; 
[site release]; 
. 
. 
.  

फिर मैं कॉलबैक लिखता हूं।

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    retriever = [PListRetriever sharedInstance]; 
    CGPoint pt = [[touches anyObject] locationInView: self]; 
     NSURL *target = [[NSURL alloc] initWithString:[retriever.plistDict valueForKey:@"url"]]; 
     [[UIApplication sharedApplication] openURL:target]; 
    } 

समस्या अभी ठीक है, इससे कोई फर्क नहीं पड़ता कि मैं यूआरएल को कैसे खोल रहा हूं। मैं कैसे निर्धारित करूं कि केवल मेरा लेबल छुआ था? अन्यथा

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [[event allTouches] anyObject]; 
    if (CGRectContainsPoint([self.site frame], [touch locationInView:self.view])) 
    { 
    NSURL *target = [[NSURL alloc] ...]; 
    ... 
    } 
} 

इसके अलावा, मत भूलना यूआरएल आप आवंटित जारी करने के लिए (:

+6

आप अपने लेबल को बटन के साथ क्यों नहीं बदलते? – zonble

उत्तर

20

आप वर्ग के लिए लेबल जोड़ने, तो आप एक हिट परीक्षण आपके विचार पर कर सकते हैं के साथ संपर्क स्थिति में आप लीक कर रहे हैं)।

+0

हाँ, उसने क्या कहा। उत्कृष्ट जवाब केविन! – Jordan

+0

यह मुझे इशारा –

1

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

4

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

label.userInteractionEnabled = YES; 


-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { 
    UITouch *touch = [touches anyobject]; 

    if(touch.view.tag == uurflagnumber) 
    NSlog(@"touched"); 
} 
19

आप touchesBegan अधिभावी के बिना यह कर सकते हैं। इशारा पहचानकर्ताओं का प्रयोग करें।

UILabel *label = ...; 
label.userInteractionEnabled = YES; 
UITapGestureRecognizer *recognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)] autorelease]; 

[label addGestureRecognizer:recognizer]; 

- (void)tapAction { 
    NSLog(@"tap performed"); 
} 
+0

माफ के साथ सेवा करता है, मेरे लिए काम नहीं किया ...(बिल्कुल भी ट्रिगर नहीं किया गया) – cV2

+0

यह कई विकल्पों के कारण हो सकता है। उदाहरण के लिए आपका स्पर्श उस परत से रद्द हो सकता है जो आपके द्वारा जेस्चर पहचानकर्ता को आपके लेबल पर अस्पष्ट कर रहा है या आपके व्यू के उपयोगकर्ता इंटरेक्शन सक्षम संपत्ति को टैप एक्शन करने पर कुछ समय पर सेट किया जा सकता है। लेबल को अपने लक्षित दृश्य के सबव्यूज़ सरणी के अंतिम ऑब्जेक्ट के रूप में जोड़ें और पुनः प्रयास करें। – Eugene

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद, userInteractionEnabled को सक्षम करने के लिए सेट किया गया था, मैंने थोड़ा कामकाज किया जिसने उपयोगकर्ता को सभी आवश्यक कार्यों को पूरा करने की अनुमति दी। धन्यवाद! – cV2

4

यूजीन के समाधान काम करता है, लेकिन आप होना चाहिए "उपयोगकर्ता बातचीत सक्षम" अपने निब फ़ाइल में टिक। या जैसा कि महिर के पास लेबल है .userInteractionEnabled = हाँ।

यहां मेरा समाधान है क्योंकि मेरे पास दो अलग-अलग लेबल थे जिन्हें मैं स्पर्श करना चाहता था। और मेरे पास मेरी निब फ़ाइल में "उपयोगकर्ता इंटरैक्शन सक्षम" है।

UITapGestureRecognizer *theSpeedTapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)]; 
[speedLabel addGestureRecognizer:theSpeedTapped]; 

UITapGestureRecognizer *theDirectionTapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)]; 
[directionLabel addGestureRecognizer:theDirectionTapped]; 

मुझे उम्मीद है कि इससे मदद मिलती है।

0

एक और देर से जवाब ...

@Kevin Sylvestre की तरह चलता है, तो आप अपने दृश्य नियंत्रक में -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event अधिभावी द्वारा एक UILabel से अधिक स्पर्श के लिए परीक्षण कर सकते हैं।

हालांकि, अगर परीक्षण UILabel के रेक्ट के साथ स्थित है तो परीक्षण करने के बजाय, मुझे यह जांचना आसान लगता है कि स्पर्श UILabel के 'दृश्य' पर था (UIView से UILabel विरासत को याद रखें)।

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesBegan:touches withEvent:event]; 

    NSSet *touchedViews = [touches valueForKeyPath:@"view"]; 
    if ([touchedViews containsObject:self.myLabel]) { 
     // do something 
    } 
} 

यह तकनीक आसानी से अन्य इंटरफ़ेस ऑब्जेक्ट्स पर लागू की जा सकती है जो UIView से प्राप्त होती है।

साथ ही, यूआईएलएबल के लिए टच इवेंट पर प्रतिक्रिया करने के लिए 'उपयोगकर्ता इंटरैक्शन सक्षम' होना भी आवश्यक है। यह इंटरफ़ेस बिल्डर (विशेषता निरीक्षक> दृश्य> उपयोगकर्ता इंटरैक्शन सक्षम) या प्रोग्रामेटिक रूप से किया जा सकता है - उदाहरण: self.myLabel.userInteractionEnabled = YES;

संबंधित मुद्दे

 संबंधित मुद्दे