एक मल्टीलाइन ऑटो टाइपिंग टेक्स्ट बॉक्स क्लास (जो माता-पिता के रूप में SKNode का उपयोग करता है) मूल रूप से 2 तत्वों का उपयोग करके बनाया गया है:

  • एक SKSpriteNode जो टेक्स्ट बॉक्स फ्रेम और पृष्ठभूमि छवि/बनावट धारक के रूप में कार्य करता है।
  • एक एनएसएमयूटेबलएरे जिसमें एनएसएसटींग्स ​​की एक सीमित सीमित मात्रा (पंक्तियां) होती है जिसमें प्रत्येक की एक निर्धारित वर्ण लंबाई होती है।

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

अभी, NSMutableArray प्रति NSString के लिए एक हार्डकोडेड अधिकतम वर्ण गणना और संपूर्ण सरणी के लिए अधिकतम पंक्ति गणना का उपयोग करता है (यह अभी 5 पंक्तियाँ हैं और जब वह सीमा समाप्त हो जाती है, तो एक नया "पृष्ठ"/सरणी बनाई जाती है)। यह मुझे हर बार जब मैं पृष्ठभूमि नोड फ्रेम आकार बदलता है तो इन पैरामीटर को मैन्युअल रूप से फिर से समायोजित करने के लिए मजबूर करता है जो पृष्ठभूमि फ्रेम को बदलने की इजाजत देने वाले वर्ग के उद्देश्य को हरा देता है।

बात यह है कि, मैं इसे इस तरह हल करने की कोशिश कर रहा हूं कि जब मैं इस कक्षा को जीथब पर पोस्ट करता हूं, तो मैं चाहता हूं कि समाधान किसी भी फ़ॉन्टनाम और फ़ॉन्ट आकार को ध्यान में रखे।

इस समस्या को हल करने के लिए मेरे पास क्या विकल्प हैं?

0
Krekin 19 सितंबर 2016, 15:27
मैं NSMutableArray का उपयोग करने से बचूंगा, यह बताने का एक तरीका है कि UIFont का उपयोग करके एक लाइन किस बिंदु पर लपेटेगी, मेरे पास अभी इसे देखने के लिए मेरे पास पहुंच नहीं है।
 – 
Knight0fDragon
19 सितंबर 2016, 17:04
आप अपना टेक्स्ट कैसे प्रस्तुत कर रहे हैं? SKLabelNode या किसी अन्य माध्यम से?
 – 
Mobile Ben
19 सितंबर 2016, 20:25
बिंदु पर: मैं पाठ की प्रत्येक पंक्ति के लिए SKLabelNode का उपयोग करता हूं।
 – 
Krekin
20 सितंबर 2016, 19:25

1 उत्तर

सबसे बढ़िया उत्तर

मैंने ऐसा ही कुछ किया है। आप जो चाहते हैं उसके अनुसार यह 100% काम नहीं करता है, लेकिन पर्याप्त समान होना चाहिए। यह एक रूट नोड का उपयोग करता है और वहां से, यह NSString की एक सरणी का उपयोग करके बहु-पंक्ति टेक्स्ट का निर्माण करेगा, जिसका उपयोग SKLabelNode के निर्माण के लिए किया जाएगा।

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

सामान्यीकृत कदम हैं:

  • आप टेक्स्ट स्ट्रिंग में प्रत्येक वर्ण पर पुनरावृति करेंगे। नोट मैं ऐसा इसलिए करता हूं क्योंकि मेरा कोड वर्ड रैपिंग के साथ-साथ अन्य संरेखण क्षमताओं का समर्थन करता है। तो मेरे लिए, मैं उस स्तर का नियंत्रण चाहता हूं। चूंकि यह केवल सृजन पर किया जा रहा है, मैं ओवरहेड के साथ ठीक हूं। यदि आप वर्ड रैप नहीं करना चाहते हैं तो आप हमेशा शब्दों की एक सरणी बना सकते हैं और वहां से काम कर सकते हैं।
  • जैसा कि आप प्रत्येक चरित्र पर पुनरावृति करते हैं, आप पंक्तियों की एक सरणी उत्पन्न करेंगे। जहां सरणी में प्रत्येक पंक्ति एक रेखा है जो आपके फ्रेम में फिट होगी। आइए अभी के लिए लंबवत बाधाओं के बारे में चिंता न करें। तो यहाँ हम मुख्य रूप से चौड़ाई के बारे में चिंतित हैं। वर्तमान पंक्ति के लिए, प्रत्येक वर्ण जिस पर आप पुनरावृति कर रहे हैं, वर्तमान पंक्ति में जुड़ जाएगा। इस संभावित लाइन स्ट्रिंग के लिए, आप NSString के sizeWithAttributes का उपयोग करेंगे, जो आपके फ़ॉन्ट के लिए कॉन्फ़िगर किया गया है। उदाहरण के लिए मेरे कोड में यह एक NSDictionary है जिसमें शामिल है: NSFontAttributeName : [UIFont fontWithName:self.fontName size:self.size]। इसका उपयोग चौड़ाई की जांच के लिए किया जाएगा, यदि वह चौड़ाई फ्रेम की चौड़ाई से अधिक है, तो आप लाइन को ओवररन कर रहे हैं।

तो कोड कुछ ऐसा दिख सकता है:

        size = [line sizeWithAttributes:attributes];

        if (size.width > maxTextWidth) {
            needNewline = YES;
        }
  • यदि आपने एक रेखा को पार कर लिया है, तो आपको यह निर्धारित करने की आवश्यकता है कि क्या आप वर्ड रैपिंग हैं। यदि आप हैं, तो आप केवल वर्तमान पंक्ति (शून्य से एक वर्ण) को लाइन सरणी में जोड़ सकते हैं। यदि नहीं, तो आपने वर्तमान पंक्ति के अंतिम शब्द को काट दिया है और फिर उसे पंक्तियों की सरणी में जोड़ दिया है।
  • मुश्किल हिस्से व्हाइटस्पेस से निपट रहे हैं और गैर-शब्द लिपटे अतिप्रवाह को संभाल रहे हैं। मैंने व्हॉट्सएप को संबोधित नहीं किया है, लेकिन आपको अपने कोड में इस पर बहुत विचार करने की आवश्यकता है। इसके अतिरिक्त, आप प्रमुख पिक्सेल आदि में भी कारक बनाना चाहते हैं।

एक बार जब आपके पास अपनी पंक्तियाँ हो जाएँ, तो आप अपने बच्चों को SKLabelNodes बना सकते हैं। मैं उन्हें रूट में जोड़ता हूं, जो मुझे समूह को कहीं भी ले जाने की अनुमति देता है।

यहां असली कुंजी लाइन्स ऐरे जेनरेशन है।

2
Mobile Ben 21 सितंबर 2016, 04:34