2010-12-07 9 views
6

को छूने वाला टेक्स्ट प्राप्त करें जिसमें मेरे पास UILabel है जिसमें कुछ पाठ और 2 महीने के नाम हैं जैसे "जनवरी और जुलाई महीने में, सूर्य चमक चोटी होगी" मैं उप-वर्गीकृत उइलाबेल और इसमें टच इवेंट जोड़ा गया । अब मैं उस पाठ के नीचे शब्द प्राप्त करना चाहता हूं जहां उपयोगकर्ता स्पर्श करता है और पता लगाता है कि उपयोगकर्ता जनवरी/जुलाई को छुआ था या नहीं। क्या यह संभव है?उइलाबेल स्पर्श करें और

उत्तर

3

मुझे लगता है कि आप UITextInputProtocol के लिए प्रलेखन में जो खोज रहे हैं उसे आप पाएंगे।

कुछ और उच्च स्तर की जानकारी के लिए, ऐप्पल के Text, Web and Editing Guide देखें, विशेष रूप से "यूआईटीएक्स्ट इनपुट कार्यान्वयन के एक मार्गदर्शित दौरे" शीर्षक वाले अनुभाग में। यह चर्चा करता है कि आप पाठ में अनुक्रमित पदों को कैसे बना सकते हैं, और स्पर्श करते हैं कि वे किस पाठ स्थिति को निकटतम स्थान पर ले गए हैं।

ऐप्पल का संदर्भ नमूना अनुमानित है जिसे SimpleTextInput कहा जाता है, लेकिन मुझे यह प्रतीत नहीं होता है। मैं देख रहा हूँ।

+0

क्या आपके पास इसका उपयोग करने के तरीके पर कोई नमूना या ट्यूटोरियल है? – Satyam

+0

हे, सेब ने नमूना कोड का उल्लेख किया - यह देखने का प्रयास कर रहा हूं कि अब मैं इसे पा सकता हूं या नहीं। –

+0

अब (2011-01-19) यह यहां उपलब्ध है: http://developer.apple.com/library/ios/#samplecode/SimpleTextInput/Introduction/Intro.html – Stephan

0

मैंने यूआईएलएबल के शीर्ष पर पारदर्शी UIViews डालकर इस समस्या को संभाला जो स्पर्श घटनाओं को संभालने के लिए वायर्ड थे। आप पाठ के प्रासंगिक हिस्सों के आकार की गणना करके हिट जोन लेबल की स्थिति और आकार को समायोजित कर सकते हैं। इस दृष्टिकोण में आपके हिट जोन के आकार को ट्विक करने में सक्षम होने का लाभ भी है जिससे उन्हें मोटा उंगलियों के साथ टैप करने के लिए बड़ा और इतना आसान बना दिया जा सके।

1

मैंने आपके प्रश्न को लागू किया है, बस my blog पर मज़े के लिए।

बस मैंने UILabel को touchEnded जोड़कर, स्पर्श स्थिति और अक्षर स्थिति को पहचानने के लिए उपclassed है।

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [[touches allObjects] objectAtIndex:0]; 
    CGPoint pos = [touch locationInView:self]; 

    int sizes[self.text.length]; 
    for (int i=0; i<self.text.length; i++) 
    { 
    char letter   = [self.text characterAtIndex:i]; 
    NSString *letterStr = [NSString stringWithFormat:@"%c", letter]; 

    CGSize letterSize = [letterStr sizeWithFont:self.font]; 
    sizes[i]   = letterSize.width; 
    } 

    int sum = 0; 
    for (int i=0; i<self.text.length; i++) 
    { 
    sum += sizes[i]; 
    if (sum >= pos.x) 
    { 
     [ _delegate didLetterFound:[ self.text characterAtIndex:i] ]; 
     return; 
    } 
    } 
} 

आशा इस
चियर्स मदद करता है।

0

मुझे मूल पोस्टर के समान समस्या थी। मैं चाहता था कि उपयोगकर्ता UILabel में लंबे समय तक दबाए रखने में सक्षम हो जो स्ट्रिंग की अल्पविराम से अलग सूची प्रदर्शित कर रहा था, और निकटतम संलग्न कॉमा के बीच स्पर्श स्थान से संबंधित उप-स्ट्रिंग निकालें।

समस्या यह है कि UILabel UITextInput प्रोटोकॉल को लागू नहीं करता है, अन्यथा कार्यान्वयन सरल होगा।

मुझे मिले सुझाए गए किसी भी कामकाज को पसंद नहीं आया, इसलिए मैंने अपने स्वयं के समाधान के साथ आने का फैसला किया। कुछ विचार और शोध के बाद, मुझे एहसास हुआ कि UILabel UITextInput का समर्थन नहीं करता है, UITextView करता है। मैं UITextViews के साथ यूआई में सभी UILabels को प्रतिस्थापित नहीं करना चाहता था, इसलिए मैंने सोचा, "दृश्यमान रूप से समान टेक्स्ट प्रतिपादन सेटिंग्स के साथ, प्रोग्राम के रूप में प्रोग्राम के रूप में UITextView क्यों नहीं बनाते हैं, और स्पर्श बिंदु को मैप करने के लिए इसके UITextInput विधियों का उपयोग करते हैं वांछित उप-स्ट्रिंग? "।

यह मेरे दृष्टिकोण से आदर्श समाधान साबित हुआ।

मैं UILabels करने के लिए एक UILongPressGestureRecognizer जुड़ा हुआ है और इशारा हैंडलर में निम्नलिखित फ़ंक्शन को कॉल करें:

-(NSString*)commaDelineatedTextAtTouchPosition:(UILongPressGestureRecognizer*)longPress 
{ 
    UILabel *gestureRecipient = (UILabel*)longPress.view; 
    UITextView *textRegionClone = [[UITextView alloc] initWithFrame:gestureRecipient.frame]; 

    // tweak the text view's content area to get the same rendering (placement and wrapping) 
    textRegionClone.textContainerInset = UIEdgeInsetsMake(0.0, -5.0, 0.0, -5.0); 
    // copy the label's text properties 
    textRegionClone.text = gestureRecipient.text; 
    textRegionClone.font = gestureRecipient.font; 
    [textRegionClone setNeedsDisplay]; 
    CGPoint loc = [longPress locationInView:gestureRecipient]; 
    UITextPosition *charR = [textRegionClone closestPositionToPoint:loc]; 

    id<UITextInputTokenizer> tokenizer = textRegionClone.tokenizer; 
    UITextRange *searchRange = [tokenizer rangeEnclosingPosition:charR withGranularity:UITextGranularityCharacter inDirection:UITextStorageDirectionBackward]; 
    NSString *commaEnclosedText = @""; 

    if (searchRange != nil) { 
     NSString *tapChar = [textRegionClone textInRange:searchRange]; 

     if ([tapChar isEqualToString:@","]) { // tapped right on a "," 
      // move the end of the range to immediately before the "," 
      searchRange = [textRegionClone textRangeFromPosition:searchRange.start toPosition:[textRegionClone positionFromPosition:searchRange.end offset:-1]]; 
     } 

     UITextPosition *docStart = textRegionClone.beginningOfDocument; 

     // search back to find the leading comma or the beginning of the text 
     do { 
      searchRange = [textRegionClone textRangeFromPosition:[textRegionClone positionFromPosition:searchRange.start offset:-1] toPosition:searchRange.end]; 
      commaEnclosedText = [textRegionClone textInRange:searchRange]; 
     } 
     while (([searchRange.start isEqual:docStart] == NO) && ([commaEnclosedText characterAtIndex:0] != ',')); 

     // now search forward to the trailing comma or the end of the text 
     UITextPosition *docEnd = textRegionClone.endOfDocument; 

     while (([searchRange.end isEqual:docEnd] == NO) && ([commaEnclosedText characterAtIndex:commaEnclosedText.length - 1] != ',')) { 
      searchRange = [textRegionClone textRangeFromPosition:searchRange.start toPosition:[textRegionClone positionFromPosition:searchRange.end offset:1]]; 
      commaEnclosedText = [textRegionClone textInRange:searchRange]; 
     } 

     commaEnclosedText = [[commaEnclosedText stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@","]] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
    } 

    return commaEnclosedText; 
} 

केवल बात यह है कि इस तकनीक के बारे में थोड़ा hacky है आप में प्रतिपादन हाथ tweak करना है TextContainerInset क्षेत्र को समायोजित करके UITextView। अन्यथा आप UILextView में पाठ के समान रैपिंग और प्लेसमेंट को ठीक नहीं करते हैं जैसा कि आप UILabel में करते हैं। अन्यथा, यह उचित जेनेरिक कोड है जो किसी और के लिए काम करना चाहिए।

0

- (void)tapped:(UITapGestureRecognizer *)tap 
{ 
    CGPoint location = [tap locationInView:_label]; 

    NSDictionary *attribute = @{NSFontAttributeName: _label.font}; 
    CGFloat width = 0; 
    for (int i = 0; i substringWithRange:NSMakeRange(i, 1)]; 
     CGSize lettersize = [letterStr sizeWithAttributes:attribute]; 
     width += lettersize.width; 
     if (width >= location.x) { 
      NSLog(@"str: %@", letterStr); 
      break; 
     } 
    } 
} 
संबंधित मुद्दे