2015-02-16 3 views
46

आप इस सवाल का शीर्षक पर आधारित के लिए आया था, लेकिन मंगोलियाई में कोई दिलचस्पी नहीं कर रहे हैं, तो आप & एक के बजाय इस क्यू की तलाश में हो सकता है:स्विफ्ट में आईओएस के लिए आप वर्टिकल टेक्स्ट UILabel और UITextView कैसे बनाते हैं?


मैं किया गया है traditional Mongolian के लिए आईओएस ऐप्स विकसित करने के लिए स्विफ्ट सीखना। समस्या यह है कि पारंपरिक मंगोलियाई ऊपर से नीचे और बाएं से दाएं से लंबवत लिखा जाता है। मेरा सवाल यह है कि मैं टेक्स्ट को लंबवत कैसे प्रदर्शित करूं और अभी भी लाइन रैपिंग कार्य कर सकता हूं?

यदि आप एक मिनट के लिए मेरे साथ रहते हैं, तो मैं समस्या को और स्पष्ट रूप से समझाने की कोशिश करूंगा। नीचे पाठ प्रकार की एक छवि है जिसे मैं प्राप्त करना चाहता हूं। यदि विदेशी लिपि आपको फेंक देती है, तो मैंने उसी पाठ का अनुसरण करने वाले अंग्रेजी पाठ को शामिल किया है। असल में, यदि ऐप में प्रदर्शित करने के लिए कोई अंग्रेजी टेक्स्ट है, तो यह इस तरह दिखना चाहिए।

enter image description here

एक सरल एक पंक्ति का UILabel के लिए, एक 90 डिग्री दक्षिणावर्त रोटेशन काम करेगा। हालांकि, एक बहु-पंक्ति UITextView के लिए मुझे लाइन रैपिंग से निपटने की आवश्यकता है। अगर मैं सिर्फ एक सादा 90 डिग्री रोटेशन करता हूं, तो लिखी गई पहली चीज़ आखिरी पंक्ति पर समाप्त हो जाएगी।

  1. जिसमें पत्र के सभी खड़ी नजर आता रहे एक कस्टम फ़ॉन्ट करें:

    अब तक मैं एक योजना मुझे लगता है कि इस समस्या को दूर कर सकते हैं बना दिया है।

  2. टेक्स्ट दृश्य को 90 डिग्री दक्षिणावर्त घुमाएं।
  3. टेक्स्ट दृश्य को क्षैतिज रूप से मिरर करें।

enter image description here

कि पाठ रैप का ध्यान रखना चाहिए।

मैं प्रतिबिंबित फ़ॉन्ट कर सकता हूं। हालांकि, मुझे नहीं पता कि UITextView के घूर्णन और मिररिंग के लिए स्विफ्ट कोडिंग कैसे करें। मुझे निम्नलिखित लिंक मिल गए हैं जो समाधान के कुछ हिस्सों को संकेत देते हैं, लेकिन वे सभी उद्देश्य सी में हैं और स्विफ्ट में नहीं हैं।

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

अद्यतन

@ sangonz का जवाब अभी भी एक महान जवाब है, लेकिन मैं अस्थायी रूप से स्वीकार किए जाते हैं जवाब के रूप में यह चिह्न हटा क्योंकि मैं तो बस सब कुछ काम करने के लिए नहीं मिल सका। विशेष रूप से:

  • स्क्रॉलिंग सक्षम करना (या तो स्क्रॉलव्यू में कस्टम दृश्य को एम्बेड करके या subclassing UIScrollView द्वारा)। जिथब परियोजना में, @ सोंगोन्ज़ ने कहा कि यह आसान होना चाहिए, लेकिन यह मेरे लिए नहीं था।
  • अभिविन्यास परिवर्तन पर शब्द रेखाओं के एक रिलाउट (खींचने के बजाए) प्राप्त करना। मुझे लगता है कि थोड़ा और अनुसंधान के साथ हल करना मुश्किल नहीं होना चाहिए।
  • टेक्स्ट लाइन दृश्य के किनारे तक क्यों नहीं जाती है? नीचे एक बड़ा अंतर है।
  • अन्य UITextView से कस्टम लंबवत दृश्य के NSTextStorage को अनलिंक कैसे करें। (this question देख)

इस बिंदु I have been using the original method अप करने के लिए मैं ऊपर का प्रस्ताव रखा, लेकिन क्या मैं वास्तव में चाहते हैं क्या @sangonz काम कर प्रस्तावित की तरह कुछ पाने के लिए है।

मैं भी अब

  • Using Core Text, नुकसान की तरह वैकल्पिक तरीकों पर विचार कर रहा हूँ: यह पहिया
  • Using WebKit, नुकसान पुनर्रचना की तरह लगता है: एप्पल अब अपने UITextView
+1

शायद आपको टेक्स्टकिट में ऐसा करने का उचित तरीका मिलेगा। –

+0

यह जानकारी टेक्स्ट फ़ॉन्ट और स्क्रिप्ट में एम्बेडेड है। –

+0

ओपनटाइप फ़ॉन्ट्स के समान, एएटी फोंट्स लिगरेचर और जटिल टेक्स्ट प्रतिपादन का समर्थन कर सकते हैं जिन्हें पारंपरिक मंगोलियाई शब्दों को सही तरीके से प्रदर्शित करने की आवश्यकता होती है। हालांकि, यह समर्थन पाठ प्रदर्शन को लंबवत बनाने के लिए विस्तारित नहीं होता है। फ़ॉन्ट में एम्बेड किए गए मंगोलियाई ग्लिफ को किनारे पर लिखा गया है और बाद में फ़ॉन्ट का उपयोग करने वाले सॉफ़्टवेयर द्वारा घुमाया जाना है। (लेकिन अगर मुझे इन फोंट का एक बड़ा काम याद आ रहा है तो कृपया मुझे और बताएं। यह मेरे प्रश्न में जो प्रस्ताव दे रहा है उससे निश्चित रूप से यह बहुत आसान होगा।) – Suragch

उत्तर

19

के लिए वेबकिट का उपयोग करता है संपादित करें: इस तरह मैंने अंततः इसे किया।

यहां मेरे गिटहब में एक बहुत ही बुनियादी कार्यान्वयन है: Vertical-Text-iOS

कुछ भी कल्पना नहीं है, लेकिन यह काम करता है। अंत में मुझे टेक्स्टकिट और छवि प्रसंस्करण मिश्रण करना पड़ा। कोड पर एक नज़र डालें। इसमें शामिल हैं:

  1. सही टेक्स्ट आयाम प्राप्त करने के लिए NSTextContainer उपclassing।
  2. सभी टेक्स्टकिट सुविधाओं को रखने के लिए प्रत्येक पंक्ति में एफ़िन ट्रांसफॉर्मेशन लागू करने वाले पाठ को प्रस्तुत करने के लिए एक कस्टम UIView बनाना और NSLayoutManager का उपयोग करके प्रतिपादन करना।

TextKit रास्ता

उचित तरीके से सभी निजी टेक्स्ट लाभ रखने के लिए (उदाहरण के लिए पर प्रकाश डाला, चयन ...) मानक TextKit API का उपयोग करने के लिए है। जिस विधि को आप प्रस्तावित कर रहे हैं वह सब तोड़ देगा या संभवतः अजीब व्यवहार में परिणाम देगा।

हालांकि, आईओएस में टेक्स्टकिट की तरह दिखता है कि अभी तक लंबवत अभिविन्यास का समर्थन नहीं करता है, लेकिन यह इसके लिए तैयार है। एक साइड नोट के रूप में, ओएस एक्स में यह कुछ हद तक समर्थित है और आप textView.setLayoutOrientation(.Vertical) पर कॉल कर सकते हैं, लेकिन इसमें अभी भी कुछ सीमाएं हैं।

NSTextLayoutOrientationProvider प्रोटोकॉल एक अंतरफलक एक अनुरूप वस्तु में बाहर रखी पाठ के लिए डिफ़ॉल्ट अभिविन्यास, एक स्पष्ट NSVerticalGlyphFormAttributeName विशेषता के अभाव में उपलब्ध कराने को परिभाषित करता है। इस इंटरफ़ेस को लागू करने वाली एकमात्र UIKit क्लास NSTextContainer है, जिसका डिफ़ॉल्ट कार्यान्वयन NSTextLayoutOrientationHorizontal देता है। एक NSTextContainer सबक्लास जो हैंडल वर्टिकल टेक्स्ट कस्टम लेआउट अभिविन्यास तर्क का समर्थन करने के लिए इस प्रॉपर्टी को NSTextLayoutOrientationVertical पर सेट कर सकता है।

स्रोत: UIKit >NSTextLayoutOrientationProvider Protocol Reference for iOS

निष्कर्ष में, आप NSTextContainer उपवर्गीकरण शुरू कर देना चाहिए, और आप NSLayoutManager और NSTextContainer एक बहुत से निपटने के लिए होगा।


कस्टम छवि प्रसंस्करण रास्ता

हैं, मैं निम्नलिखित दृष्टिकोण का सुझाव दूसरी ओर आप अपने कस्टम पाठ प्रतिपादन का पालन करने का फैसला किया।

  1. सामान्य पाठ एक छिपी परत में एक सामान्य फ़ॉन्ट के साथ प्रस्तुत करें। इसे अपने बाउंडिंग बॉक्स में सही आकार दें।
  2. टेक्स्ट गुण प्राप्त करें, मुख्य रूप से टेक्स्ट ऊंचाई और रेखा अंतर।
  3. छवि को को प्रत्येक पंक्ति को नीचे से ऊपर की तरफ से नीचे की तरफ से विपरीत क्रम में ड्राइंग करने की प्रक्रिया करें। परिणामस्वरूप आपको एक नया CGImage प्राप्त करना चाहिए।
  4. UIImage बनाने और सही UIImageOrientation मान सेट करने के लिए छवि को घुमाएं।
  5. उस छवि कोUIScrollView में डालें जो केवल क्षैतिज स्क्रॉलिंग की अनुमति देता है।

सावधान रहें कि यह विधि पूरे पाठ को प्रस्तुत करती है, इसलिए इसे बहुत लंबे ग्रंथों के लिए उपयोग न करें। यदि आपको ऐसा करने की ज़रूरत है, तो आपको एक टाइलिंग दृष्टिकोण पर विचार करने की आवश्यकता होगी। WWDC 2013 > 217 - Exploring Scroll Views on iOS 7 देखें।

this image

गुड लक!

अपडेट: (GitHub परियोजना से छवि)

enter image description here

+1

गिटहब में अपना समाधान/कार्य-प्रगति सार्वजनिक भी बनाएं। मुझे यकीन है कि बहुत से लोग इसे उपयोगी और बेहतर पाएंगे। – Rivera

+0

इस समस्या को हल करने के लिए दो वैकल्पिक रणनीतियों को देने के साथ-साथ ध्यान से तैयार किए गए उत्तर के लिए इस उत्तर में निश्चित रूप से +1 है। आपका पहला विचार सबसे अच्छा लगता है क्योंकि मुझे लंबे ग्रंथों का समर्थन करने की आवश्यकता होगी। हालांकि, इस सवाल को पोस्ट करने का मेरा कारण यह है कि मैं आईओएस के लिए नया हूं और किसी भी रणनीति, मेरा या आपके लागू करने के लिए स्विफ्ट प्रोग्रामिंग कौशल की कमी है। तो मैं इसे पूरा करने के लिए वास्तविक कोड की तलाश में हूं। जब तक मैं कुछ काम नहीं करता तब तक मैं निश्चित रूप से इस पर प्रयोग और प्लगिंग करूँगा। – Suragch

+0

सुझावों के लिए धन्यवाद। मैंने अपनी टिप्पणी संपादित की है और कुछ नमूना कोड लिंक किया है। आशा करता हूँ की ये काम करेगा! – sangonz

3

आप पाठ मैं एक दाएँ-से-बाएँ लेआउट का उपयोग करें ताकि आप मिरर को छोड़ सकते हैं सुझाव है कि बारी बारी से करने जा रहे हैं कदम (और बस दूसरी तरफ घुमाएं)।

तुम बस लेबल/TextView के transform गुण सेट करने के लिए सक्षम होना चाहिए:

view.transform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(CGFloat(-M_PI_2)), view.bounds.width, view.bounds.height) 

आप आप बारी बारी से करने के बाद, क्योंकि दृश्य इसके मूल के चारों ओर घूमता (ऊपरी बाएँ में) अनुवाद करने के लिए की जरूरत है।

अच्छी खबर यह है कि पिक्सल एक ही समय में इशारे और नल बदल जाते हैं, इसलिए नियंत्रण उन तरीकों से काम करना जारी रखता है जिनकी आप अपेक्षा करते हैं।

+2

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

+1

मैंने अभी यह जवाब लिखा है कि यह सीखने में सहायता करें कि यह कैसे करें: http://stackoverflow.com/a/28717635/3681880 – Suragch

संबंधित मुद्दे