2016-12-24 8 views
5

में कहीं भी कर्सर चयन की अनुमति दें मेरे पास एक एकल UITextView है, जो आपको टेक्स्ट की कई पंक्तियां लिखने देता है।UITextView

मैं उपयोगकर्ताओं को लंबी प्रेस के बिना शब्दों के बीच अक्षरों का चयन कैसे कर सकता हूं?

वर्तमान में, जब टचस्क्रीन का उपयोग कर, एक शब्द के बीच वर्ण का चयन करने के कर्सर या तो चला जाता है शुरू या शब्द के अंत:

उदाहरण: 'सी' पर क्लिक शब्द के अंत तक कर्सर ले जाता है

cursor at end

उदाहरण: पर 'एक' चाल शब्द के प्रारंभ में कर्सर से क्लिक करके

cursor at start

वांछित कर्सर व्यवहार: पाठ में कहीं भी चुनाव enter image description here

कहीं भी पाठ चयन की अनुमति (देर तक दबाए आवर्धक कांच + बिना) की सुविधा iOS के लिए कई कोड संपादक क्षुधा में पाया जाता है, इस तरह के रूप Coda और Pythonista

+1

क्या यह हार्डवेयर समस्या का अधिक नहीं है? या कम से कम एक सिस्टम मुद्दा। आखिरकार, आईपैड पर जहां भी आप चाहते हैं वहां सम्मिलन बिंदु को "स्लाइड" करने का एक तरीका है। लेकिन आईफोन पर। तो यह वास्तव में आप पर निर्भर नहीं है। – matt

+0

@ मैट मैंने अभी आईफोन के लिए कुछ कोड एडिटर ऐप की कोशिश की है, उनमें से कुछ किसी भी बिंदु पर सम्मिलन बिंदु की अनुमति देते हैं लेकिन मुझे यकीन नहीं है कि उन्होंने इसे कैसे हासिल किया। उदाहरण के लिए, इस पाठ के साथ 'System.out।println ("हैलो") ', उपयोगकर्ता तर्क को बदलने के लिए 'UITextView' में कहीं भी चुन सकता है। – user2560886

+0

चरित्र स्तर चयन संपादक (कोडा और पायथनिस्टा?) UITextView का उपयोग नहीं कर सकते हैं। आप एक कस्टम टेक्स्ट एडिटर व्यू बना सकते हैं ("आईओएस के लिए टेक्स्ट प्रोग्रामिंग गाइड" दस्तावेज़ से परामर्श लें) – 9dan

उत्तर

3

यह हासिल करना मुश्किल चुनौती नहीं है।

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

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

अब आपको जो चाहिए वह प्राप्त करने के लिए। किसी भी तरह स्पर्श का बिंदु प्राप्त करें (या तो UIResponder एपीआई या इशारा पहचानकर्ता का उपयोग कर)। याद रखें, टेक्स्ट व्यू एक स्क्रॉल व्यू है जिसमें एक बड़ा सबव्यूव शामिल है जहां सामग्री खींची जाती है। convertPoint: एपीआई का उपयोग करके आंतरिक दृश्य समन्वय प्रणाली में आपको टेक्स्ट व्यू समन्वय प्रणाली से, इस स्पर्श बिंदु को परिवर्तित करना होगा। एक बार जब आप गए हैं, आपको स्पर्श के बिंदु पर चरित्र सूचकांक प्राप्त करने के लिए पाठ दृश्य के लेआउट प्रबंधक का उपयोग कर सकते हैं:

NSUInteger chIdx = [self characterIndexForPoint:touchPoint inTextContainer:self.textContainer fractionOfDistanceBetweenInsertionPoints:NULL]; 

आप selectedRange संपत्ति का उपयोग कर पाठ को देखने के कर्सर सेट करने के लिए इस सूचकांक का उपयोग कर सकते हैं।

+0

क्या आप जानते हैं कि 'characterIndexForPoint' के लिए उपयोग किए गए स्थान पर कुछ छूट कैसे जोड़ें। एक वर्ण – user2560886

+0

पर टैप के रूप में टैप प्लस/माइनस 1 पीएक्स को पंजीकृत करना आपको 'boundingRectForGlyphRange: inTextContainer: 'का उपयोग करके स्वयं को यह ह्युरिस्टिक करना होगा। ध्यान दें कि यह ग्लाइफ रेंज स्पेस में है, जबकि आपका कर्सर चरित्र रेंज में है (वैसे भी, चरित्र की एनएसएसटींग अवधारणा, वैसे भी)। –

+0

मुझे जिस समस्या का सामना करना पड़ रहा है वह यह है कि यदि किसी चरित्र का चयन रेखा से थोड़ा ऊपर/ऊपर है, तो 'characterIndexForPoint' एक खराब अनुक्रमणिका देता है, जो "निकटतम" वर्ण की बजाय रेखा के प्रारंभ/अंत में वर्णों के अनुरूप होता है वाई धुरी दिशा मुझे यकीन नहीं है कि कैसे 'boundingRectForGlyphRange' मेरे कोड में फिट बैठता है। क्या यह प्रवाह आपका मतलब है: 1) UITextView' 2 में पाठ की रेखा के लिए ग्लिफ की रेंज प्राप्त करें) ग्लाइफ रेंज के लिए बाध्यकारी आय प्राप्त करें 3) +/- 1 px 4 द्वारा बाध्यकारी आय का विस्तार करें 4) बाध्यता के साथ अनुक्रमणिका प्राप्त करने के लिए 'characterIndexForPoint' का उपयोग करें आयताकार? – user2560886