मेरे पास कुछ कोड है जो CoreText का उपयोग करके कुछ जिम्मेदार टेक्स्ट खींचता है। इसमें, मैं यूआरएल खोज रहा हूं और उन्हें नीला बना रहा हूं। विचार क्लिक करने योग्य लिंक प्राप्त करने के लिए UIWebView
के सभी ओवरहेड में नहीं लाने का विचार है। एक बार जब उपयोगकर्ता उस लिंक पर टैप करता है (पूरे टेबल व्यू सेल नहीं), तो मैं एक प्रतिनिधि विधि को आग लगाना चाहता हूं जिसका उपयोग तब एक मोडल व्यू पेश करने के लिए किया जाएगा जिसमें उस यूआरएल पर एक वेब व्यू होगा।कोरटेक्स्ट का उपयोग करना और क्लिक करने योग्य क्रिया बनाने के लिए स्पर्श
मैं पथ और स्ट्रिंग को दृश्य के उदाहरण चर के रूप में सहेज रहा हूं, और ड्राइंग कोड -drawRect:
में होता है (मैंने इसे ब्रेवटी के लिए छोड़ दिया है)।
मेरा स्पर्श हैंडलर हालांकि, अधूरा है, प्रिंटिंग नहीं कर रहा है, जिसे मैं उम्मीद करता हूं। यह नीचे है:
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:self];
CGContextRef context = UIGraphicsGetCurrentContext();
NSLog(@"attribString = %@", self.attribString);
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)self.attribString);
CTFrameRef ctframe = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, self.attribString.length), attribPath, NULL);
CFArrayRef lines = CTFrameGetLines(ctframe);
for(CFIndex i = 0; i < CFArrayGetCount(lines); i++)
{
CTLineRef line = CFArrayGetValueAtIndex(lines, i);
CGRect lineBounds = CTLineGetImageBounds(line, context);
// Check if tap was on our line
if(CGRectContainsPoint(lineBounds, point))
{
NSLog(@"Tapped line");
CFArrayRef runs = CTLineGetGlyphRuns(line);
for(CFIndex j = 0; j < CFArrayGetCount(runs); j++)
{
CTRunRef run = CFArrayGetValueAtIndex(runs, j);
CFRange urlStringRange = CTRunGetStringRange(run);
CGRect runBounds = CTRunGetImageBounds(run, context, urlStringRange);
if(CGRectContainsPoint(runBounds, point))
{
NSLog(@"Tapped run");
CFIndex* buffer = malloc(sizeof(CFIndex) * urlStringRange.length);
CTRunGetStringIndices(run, urlStringRange, buffer);
// TODO: Map the glyph indices to indexes in the string & Fire the delegate
}
}
}
}
}
यह इस समय सबसे सुंदर कोड, मैं अभी भी सिर्फ यह काम है, तो कोड गुणवत्ता माफ करने के लिए कोशिश कर रहा हूँ नहीं है।
मेरी समस्या यह है कि जब मैं लिंक के बाहर टैप करता हूं, तो मुझे क्या उम्मीद है, ऐसा होता है: कुछ भी नहीं निकाल दिया जाता है।
हालांकि, मैं अगर मैं एक ही पंक्ति लिंक पर है, जो नहीं होता है नल "Tapped line"
मुद्रित करने के लिए उम्मीद करेंगे, और मैं दोनों "Tapped line"
और "Tapped run"
अगर मैं यूआरएल पर नल मुद्रित करने के लिए उम्मीद करेंगे।
मुझे यह पता नहीं है कि यह कहां लेना है, संसाधनों को मैंने इस मुद्दे के समाधान के लिए देखा है कोको विशिष्ट (जो लगभग पूरी तरह से लागू नहीं है), या इस विशिष्ट मामले पर जानकारी की कमी है।
मैं खुशी से पॉइंटर्स को दस्तावेजों पर ले जाऊंगा जो विस्तार से पता लगाएंगे कि कोड पर कोर टेक्स्ट ड्राइंग की सीमाओं के भीतर कोई स्पर्श हुआ है, लेकिन इस बिंदु पर, मैं बस इस समस्या को हल करना चाहता हूं, इसलिए कोई भी मदद की बहुत सराहना की जाएगी।
अद्यतन: मैंने अपनी समस्या को समन्वय मुद्दे पर सीमित कर दिया है। मैंने समन्वय (और ऊपर दिखाए गए अनुसार नहीं) को फिसल दिया है और मुझे जो समस्या मिल रही है वह है कि मैं उम्मीद करता हूं कि रजिस्टर को छूता है, लेकिन समन्वय स्थान फ़्लिप हो जाता है, और मैं इसे वापस फ्लिप नहीं कर सकता।
आप को ध्यान में रखा है तथ्य यह है कि CoreText एक फ़्लिप समन्वय प्रणाली का उपयोग करता है? अभी यह मुझे लगता है जैसे आप दो अलग समन्वय प्रणालियों में चीजों की तुलना कर रहे हैं। – Jacques
इसके अलावा, इस तरह के हर स्पर्श पर फ्रेमसेटर को फिर से बनाना एक बुरा विचार है। फ़्रेमसेटर बनाना बहुत महंगा है, इसलिए टेक्स्ट को पहली बार चित्रित या सेट करते समय आपको इसे कैश करना चाहिए। – Jacques
मेरी विकास पद्धति बस है: 1) इसे काम करें; 2) इसे सही बनाओ; 3) इसे तेज/साफ करें। चलो # 2 के साथ सौदा करते हैं जब हम # 1 जा रहे हैं :) समन्वय प्रणाली के संबंध में भी, हाँ मुझे एहसास है, और थोड़ी देर के लिए मैं इसे संभालने में कामयाब नहीं था।कोड में अब, एक सहयोगी से परामर्श करने के बाद, उसने मुझे सीधे इस पर सेट किया, और कम से कम रनों पर यह कम से कम लाइनों पर नल का पता लगा रहा है। अभी भी एक को समझने की कोशिश कर रहा है। – jer