2012-01-10 17 views
5

में छूने वाला शब्द प्राप्त करना मैं एक टेक्स्ट-कंटेनर घटक बनाना चाहता हूं जो यह इंगित करने में सक्षम है कि उस पर स्पर्श होने पर निकटतम शब्द क्या है (यानी शब्द "पीछे "छुआ बिंदु)।UILabel/UITextView

सबसे पहले, मैंने एक यूलाबेल सबक्लास बनाया और स्पर्शों को ओवरराइड किया: साथ: स्पर्श किया गया CGPoint निर्धारित करने के लिए विधि। मैंने एक विधि भी लिखी है जो आकार के साथ प्रत्येक शब्द के संबंधित "फ्रेम" (सीजीईजीईटी) की गणना करता है आकार के साथ: विथथ: लाइनब्रैक मोड:। स्पर्श किए गए CGPoint और इस फ्रेम के साथ, मैं निर्धारित कर सकता हूं कि वास्तव में कौन सा शब्द स्पर्श किया जा रहा है। लेकिन फ्रेम की गणना करने वाली विधि केवल मोनो-लाइन टेक्स्ट के साथ काम करती है।

तो अब मुझे यह जानने की जरूरत है कि पाठ का कौन सा हिस्सा किसी दिए गए रेखा पर है (यानी पाठ को कैसे विभाजित किया गया है), ताकि मैं प्रत्येक शब्द के सही बाएं-मार्जिन और शीर्ष-मार्जिन को समझ सकूं।

कोई विचार यह है कि मैं इसे कैसे प्राप्त कर सकता हूं? या शायद आप इसे प्राप्त करने के लिए एक और अधिक सरल समाधान है? This post was unfortunately not very helpful... ...

उत्तर

9

(वहाँ अपने लिंक किए गए पोस्ट में एक नमूना कोड परियोजना है कि कुछ उपयोगी नमूना कोड में क्या है के लिए एक लिंक है, लेकिन मैं भी तुम यहाँ के लिए प्रक्रिया की रूपरेखा तैयार करेंगे।)

संक्षेप में, आप कोर टेक्स्ट का उपयोग करने की आवश्यकता होगी, जो ऐप्पल के उन्नत सी-आधारित टेक्स्ट हैंडलिंग फ्रेमवर्क है जो आईओएस और ओएस एक्स में सभी परिष्कृत टेक्स्ट लेआउट का समर्थन करता है।

पूरा कोड कुछ हद तक शामिल होगा, लेकिन महत्वपूर्ण विधियां देखना चाहते हैं:

CTFramesetterCreateWithAttributedString() - इसका उपयोग करें, conj में एक NSAttributedString के साथ एकीकरण जिसे आप अपने लेबल के पाठ से प्राप्त करेंगे - फ्रेमसेट

CTFramesetterCreateFrame() - उपरोक्त फ्रेमसेट से अपने टेक्स्ट के लिए CTFrameRef प्राप्त करने के लिए इसका उपयोग करें। ऐसा करने के लिए आपको अपने लेबल सीमाओं का उपयोग करके एक CGPathRef बनाना होगा।

CTFrameGetLines(), CTFrameGetLineOrigins() - इन टाइपसेट लाइनों के लिए इसी CTLineRefs प्राप्त करने के लिए उपयोग करते हैं, और लाइन मूल के निर्देशांक, क्रमशः, तो CTLineGetStringIndexForPosition() एक स्पर्श स्थान पर चरित्र सूचकांक को खोजने के लिए इस्तेमाल करते हैं।

फिर आप इस चरित्र सूचकांक (रेखा के संदर्भ फ्रेम में) का उपयोग पिछड़े काम करने और वास्तविक चरित्र/शब्द/आदि को अपनी पूर्ण स्ट्रिंग के भीतर ढूंढने के लिए कर सकते हैं।

मत भूलना कि मायने रखती है एक जोड़े को मुद्दों से जटिल कर रहे हैं:

  1. तो आप का उपयोग UILabel के मूल ड्राइंग आप पूरी तरह से अपने टाइपसेटिंग मैट्रिक्स, जिनमें से अधिकांश के बाद से बोझिल हो सकता है मैच के लिए देखभाल करने के लिए होगा ऑब्जेक्ट्स (जैसे सीटीएफओन्टआरएफ) उनके यूआईकिट समकक्षों के साथ टोल-फ्री नहीं हैं। अपने स्वयं के चित्र को कार्यान्वित करना कभी-कभी आसान हो सकता है, जो मीट्रिक मिलान की गारंटी देगा।

  2. कोर टेक्स्ट सामान्य आईओएस ड्राइंग सिस्टम के संबंध में एक उलटा समन्वय प्रणाली का उपयोग करता है। यदि आप निराशाजनक परिणाम प्राप्त कर रहे हैं, और विशेष रूप से यदि आप अपना खुद का चित्रण करते हैं, तो यह देखने के लिए कुछ है।

दुनिया में सबसे आसान काम नहीं है, लेकिन असंभव से बहुत दूर है। सौभाग्य!

+0

असल में, पाठ को स्वयं खींचना वह है जो मैं बचाना चाहता हूं क्योंकि यह प्रारंभिक आवश्यकता पर विचार करने के बाद एक ओवरहेड लगता है। मैं आपके द्वारा दिए गए कोरटेक्स्ट कुंजी-फ़ंक्शन पर विचार करूंगा, धन्यवाद! – AgentCorleone

2

हालांकि यह एक पुराना सवाल है, लेकिन मैंने सोचा कि यह कुछ मदद की हो सकती है।

के बाद से कोर पाठ सीखने बहुत बड़ा था, मैं के लिए GLTapDemo by German Laullon

कुछ परिवर्तन करके

, इस UILabel पर स्पर्श किए गए शब्द पता लगाने के लिए अच्छा काम करता है का विकल्प चुना।

+1

मैंने VSWordDetector समाधान और यह दोनों की कोशिश की, और यह मेरे उपयोग के मामले के लिए अधिक प्रभावी ढंग से काम करने के लिए पाया। –

5

थोड़ा सा खोज करने के बाद मैंने इसके लिए एक कोड लिखा है। कोड UITextView और UILabel के लिए काम करेगा।
बस VSWordDetector.zip डाउनलोड करें और फिर इसे अनजिप करें और & खींचें VSWordDetector फ़ोल्डर को अपनी परियोजना में छोड़ दें।
आपकी ViewController कक्षा में दो फाइलें VSWordDetector.h और VSWordDetector.m
#import VSWordDetector.h हैं।

@property (strong, nonatomic) VSWordDetector *wordDetector; 

नोट: अपनी संपत्ति के रूप में स्थानीय रूप से नहीं लेते हैं बनाओ।

अब आप के लिए अपने तैयार, बस textViews या Labels

-(void)viewDidLoad 
{ 
    self.wordDetector = [[VSWordDetector alloc] initWithDelegate:self]; 
    [self.wordDetector addOnView:textView]; 
    [self.wordDetector addOnView:label]; 
} 

-(void)wordDetector:(VSWordDetector *)wordDetector detectWord:(NSString *)word 
{ 
    NSLog(@"Detected Word: %@", word); 
} 

इस प्रतिनिधि पद्धति पर इसे जोड़ने के फोन दिया जाएगा जब आप कनेक्ट किए गए लेबल या TextView पर नल होगा।

संपादित करें: के लिए VSWordDetector

अनुशंसित संपादित करें: यदि आप यहां नमूना कोड डाउनलोड नहीं करना चाहते हैं तो दोनों फाइलों के लिए कोड है। कृपया इस जिस्ट फ़ाइल को VSWordDetector देखें।

+0

हाय। मैंने आपके कोड का उपयोग करने की कोशिश की, लेकिन टैप नहीं पता चला है। मैंने आपके द्वारा दिए गए कदमों का पालन किया, क्या आप कृपया मुझे बता सकते हैं कि मैं गलत कहां जा रहा हूं? –

+1

@ निजिल नायर क्षमा करें, लेकिन मैं यह नहीं कह सकता कि आप कहां गलत कर रहे हैं। तो मैंने एक नमूना बनाया कृपया मेरे उत्तर का हिस्सा संपादित करें देखें। – TheTiger

+0

मैं ज़िप कोड का एक बड़ा मजा नहीं हूँ। यहां 'VSWordDetector' के प्रासंगिक भाग जोड़ें या गीथब पर कोड पेस्ट करें। – Sulthan