मैं उपर्युक्त प्रभाव प्राप्त करने में कामयाब रहा, इसलिए सोचा कि मैं इसके लिए उत्तर पोस्ट करूंगा।
अगर किसी को इसे और अधिक प्रभावी बनाने के बारे में कोई सुझाव है, तो कृपया योगदान देने में संकोच न करें। मैं आपके उत्तर को सही के रूप में चिह्नित करना सुनिश्चित करूंगा। :)
ऐसा करने के लिए, आपको NSAttributedString
पर "कस्टम विशेषता" जोड़ने की आवश्यकता होगी।
असल में, इसका मतलब यह है कि आप किसी भी कुंजी-मूल्य जोड़ी को जोड़ सकते हैं, जब तक कि यह ऐसा कुछ है जिसे आप NSDictionary
उदाहरण में जोड़ सकते हैं। अगर सिस्टम उस विशेषता को नहीं पहचानता है, तो यह कुछ भी नहीं करता है। डेवलपर के रूप में, उस विशेषता के लिए एक कस्टम कार्यान्वयन और व्यवहार प्रदान करना आपके ऊपर निर्भर है।
इस उत्तर के प्रयोजनों के लिए, मान लीजिए कि मैंने [UIColor greenColor]
के मूल्य के साथ @"MyRoundedBackgroundColor"
नामक एक कस्टम विशेषता जोड़ा है।
अनुसरण करने वाले चरणों के लिए, आपको CoreText
की सामग्री के बारे में मूलभूत समझ की आवश्यकता होगी। समझने के लिए एक फ्रेम/लाइन/ग्लिफ़ रन/ग्लिफ़ क्या, आदि
के लिए Apple's Core Text Programming Guide की जाँच करें तो, यहाँ कदम हैं:
- एक कस्टम UIView उपवर्ग बनाएँ।
NSAttributedString
को स्वीकार करने के लिए एक संपत्ति है।
NSAttributedString
उदाहरण का उपयोग कर CTFramesetter
बनाएं।
drawRect:
विधि
- ओवरराइड
CTFramesetter
से एक CTFrame
उदाहरण बनाएँ।
- बनाने के लिए आपको
CGPathRef
देने की आवश्यकता होगी। उस CGPath
को उस फ्रेम के समान बनाएं जिसमें आप टेक्स्ट खींचना चाहते हैं।
- वर्तमान ग्राफिक्स संदर्भ प्राप्त करें और टेक्स्ट समन्वय प्रणाली को फ़्लिप करें।
CTFrameGetLines(...)
का उपयोग करके, CTFrame
में सभी लाइनें प्राप्त करें जिन्हें आपने अभी बनाया है।
CTFrameGetLineOrigins(...)
का उपयोग करके, CTFrame
के लिए सभी लाइन मूल प्राप्त करें। एक
for loop
शुरू
- -
CTLine
की सरणी में प्रत्येक पंक्ति के लिए ...
CGContextSetTextPosition(...)
का उपयोग कर CTLine
की शुरुआत करने के लिए पाठ स्थिति निर्धारित करें।
CTLineGetGlyphRuns(...)
का उपयोग CTLine
से सभी ग्लाइफ रन (CTRunRef
) प्राप्त करें। CTRun
की सरणी में प्रत्येक glyphRun के लिए ...
CTRunGetStringRange(...)
का उपयोग कर रन की सीमा प्राप्त करें -
- एक और
for loop
शुरू करो।
CTRunGetTypographicBounds(...)
का उपयोग कर टाइपोग्राफ़िक सीमाएं प्राप्त करें।
CTLineGetOffsetForStringIndex(...)
का उपयोग कर रन के लिए एक्स ऑफ़सेट प्राप्त करें।
- उपरोक्त कार्यों से लौटाए गए मानों का उपयोग करके बाउंडिंग रेक्ट की गणना करें (चलो इसे
runBounds
पर कॉल करें)।
- याद रखें -
CTRunGetTypographicBounds(...)
टेक्स्ट के "चढ़ाई" और "मूल" को स्टोर करने के लिए चर के लिए पॉइंटर्स की आवश्यकता है। रन ऊंचाई प्राप्त करने के लिए आपको उन्हें जोड़ने की आवश्यकता है।
CTRunGetAttributes(...)
का उपयोग कर रन के लिए गुण प्राप्त करें।
- जांचें कि विशेषता शब्दकोश में आपकी विशेषता है या नहीं।
- यदि आपकी विशेषता मौजूद है, तो आयत की सीमाओं की गणना करें जिन्हें चित्रित करने की आवश्यकता है।
- कोर टेक्स्ट की आधार रेखा पर मूल उत्पत्ति है। हमें पाठ के निम्नतम बिंदु से शीर्षतम बिंदु तक आकर्षित करने की आवश्यकता है। इस प्रकार, हमें वंश के लिए समायोजित करने की आवश्यकता है।
- तो, चरण 16 (
runBounds
) में गणना की गई बाध्यकारी आय से मूल को घटाएं।
- अब हमारे पास
runBounds
है, हम जानते हैं कि हम किस क्षेत्र को पेंट करना चाहते हैं - अब हम विशिष्ट गोलाकार कोनों के साथ एक रेक्ट खींचने और भरने के लिए CoreGraphis
/UIBezierPath
विधियों का उपयोग कर सकते हैं।
UIBezierPath
में bezierPathWithRoundedRect:byRoundingCorners:cornerRadii:
नामक एक सुविधा वर्ग विधि है जो आपको विशिष्ट कोनों को गोल करने देती है। आप दूसरे पैरामीटर में बिट मास्क का उपयोग करके कोनों को निर्दिष्ट करते हैं।
- अब आपने रेक्ट भर लिया है, बस
CTRunDraw(...)
का उपयोग करके ग्लाइफ रन खींचें।
- अपनी कस्टम विशेषता बनाने के लिए जीत का जश्न मनाएं - एक बियर या कुछ पीएं!: डी
यह पता लगाने के संबंध में कि विशेषता सीमा कई रनों तक फैली हुई है, तो आप पहली बार जब आपके रन को गुणों का सामना करते हैं तो आप अपनी कस्टम विशेषता की पूरी प्रभावी सीमा प्राप्त कर सकते हैं। यदि आपको लगता है कि आपकी विशेषता की अधिकतम प्रभावी सीमा की लंबाई आपके रन की लंबाई से अधिक है, तो आपको दाएं किनारे पर तेज कोनों को पेंट करने की आवश्यकता है (बाएं से दाएं स्क्रिप्ट के लिए)। अधिक गणित आपको अगली पंक्ति के लिए हाइलाइट कोने शैली का पता लगाने देगा। :)
संलग्न प्रभाव का एक स्क्रीनशॉट है। शीर्ष पर वाला बॉक्स मानक UITextView
है, जिसके लिए मैंने विशेषता टेक्स्ट सेट किया है। नीचे दिया गया बॉक्स वह है जो उपर्युक्त चरणों का उपयोग करके लागू किया गया है। टेक्स्टव्यू दोनों के लिए वही जिम्मेदार स्ट्रिंग सेट की गई है।
फिर, अगर मैंने उपयोग किए गए एक से बेहतर दृष्टिकोण है, तो कृपया मुझे बताएं! : डी
आशा है कि यह समुदाय की सहायता करे। :)
चीयर्स!
हैलो। आपके कमेंट के लिए धन्यवाद। :) मुझे नहीं लगता कि NSLayoutManager आईओएस 6 में उपलब्ध है। आईओएस 6 में सीटीफ्रेम सैटर है, जो मुझे सीटीफ़्रेम -> सीटीलाइन -> सीटीजीलीफ देगा। अगर मुझे आवश्यक पाठ की सीमा सही ढंग से मिलती है, तो मैं आयताकार पेंट कर सकता हूं और फिर सीटीफ़्रेम को स्वयं खींचने के लिए कह सकता हूं। – codeBearer
क्षमा करें, हाँ। हो सकता है कि टेक्स्ट व्यू-> चयनित रेंज और '- [UITextInput selectRectsForRange:] ' – nielsbot
क्या आप कोशिश कर सकते हैं? 1. लेबल पारदर्शी बनाएं 2. सबस्ट्रिंग टेक्स्ट रेंज का फ्रेम प्राप्त करें (http://stackoverflow.com/questions/19417776/how-do-i-locate-the-cgrect-for-a-substring-of -text-in-a-uilabel) 3. लेबल – Robert