2010-06-13 11 views
7

मैं आईपैड पर कस्टम दस्तावेज़ प्रारूप के लिए हाइलाइटिंग/एनोटेशन क्षमताओं के साथ एक दस्तावेज़ दर्शक को कार्यान्वित कर रहा हूं। दस्तावेज लंबे समय तक हैं (100 से 200 पेज, यदि पेपर पर मुद्रित हैं) और मुझे सही दृष्टिकोण खोजने में मुश्किल हो रही है। यहां आवश्यकताएं हैं:आईपैड पर एक लंबे दस्तावेज़ को प्रस्तुत करना

1) मूल समृद्ध-पाठ स्टाइल: बाएं/दाएं मार्जिन का नियंत्रण। फ़ॉन्ट नाम, आकार, अग्रभूमि/पृष्ठभूमि रंग, और लाइन दूरी का नियंत्रण। बोल्ड, इटालिक्स, अंडरलाइन, आदि

2) मनमानी पाठ क्षेत्रों का चयन और हाइलाइटिंग (पैराग्राफ सीमाओं तक सीमित नहीं है, जैसे सफारी/UIWebView में)।

3) कट/कॉपी/पेस्ट पॉपअप (UIMenuController) का अनुकूलन यह ऐप की आवश्यक आवश्यकताओं में से एक है।

मेरा पहला कार्यान्वयन UIWebView पर आधारित था। मैंने पाठ स्टाइल के लिए सीएसएस के साथ एचटीएमएल के रूप में दस्तावेज प्रस्तुत किया। लेकिन मुझे उस प्रकार का टेक्स्ट चयन व्यवहार नहीं मिला जो मैं चाहता था (पैराग्राफ सीमाओं में) और UIMenuController को UIWebView के भीतर से अनुकूलित नहीं किया जा सकता है।

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

बहुत शर्मीली नहीं है।

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

तो मैं कोरटेक्स्ट को देख रहा हूं, लेकिन वेब पर अनमोल कुछ उदाहरण हैं। मैं इस सरल छोटे डेमो के साथ एक छोटे से समय बिताया:

http://github.com/jonasschnelli/I7CoreTextExample/

इससे पता चलता है CoreText उपयोग करने के लिए कैसे एक UIView में एक NSAttributedText स्ट्रिंग आकर्षित करने के लिए। लेकिन इसकी अपनी समस्याएं हैं: यह टेक्स्ट-चयन व्यवहार को लागू नहीं करती है, और यह UIMenuController प्रस्तुत नहीं करती है, इसलिए मुझे यह नहीं पता कि ऐसा कैसे किया जाए। और, सबसे महत्वपूर्ण बात यह है कि लंबे दस्तावेज़ों के लिए महत्वपूर्ण प्रदर्शन में गिरावट के साथ, यह पूरे दस्तावेज़ को एक साथ में खींचने की कोशिश करता है। मेरे दस्तावेज़ों में हजारों पैराग्राफ हो सकते हैं, और एक समय में दस्तावेज़ का 1% से भी कम स्क्रीन पर स्क्रीन पर हो सकता है।

प्लस तरफ, इन दस्तावेज़ों में पहले से ही सटीक स्वरूपण जानकारी है। मुझे पाठ की प्रत्येक पंक्ति की सटीक पृष्ठ-स्थिति पता है, इसलिए मुझे लेआउट इंजन की आवश्यकता नहीं है।

क्या कोई जानता है कि CoreText का उपयोग करके इस तरह के दृश्य को कैसे कार्यान्वित किया जाए? मैं समझता हूँ कि इस तरह की एक प्रश्न के लिए overkill है कि एक पूर्ण कार्यान्वयन, लेकिन मैं कुछ बुनियादी आवश्यकताओं के साथ एक अच्छा CoreText उदाहरण के लिए देख रहा हूँ:

1) सटीक लेआउट & नियंत्रण स्वरूपण (स्वरूपण मैट्रिक्स और पाठ का उपयोग शैलियों मैं पहले से ही गणना की है)।

2) पाठ के मनमाने ढंग से चयन।

3) UIMenuController का अनुकूलन।

4) ऑफ़-स्क्रीन ऑब्जेक्ट्स के लिए संसाधनों का कुशल रीसाइक्लिंग।

टेक्स्ट तत्वों को ऑफ-स्क्रीन स्क्रॉल करते समय मुझे अपने स्वयं के रीसाइक्लिंग को लागू करने में खुशी होगी, लेकिन क्या आपको UIScrollView को फिर से कार्यान्वित करने की आवश्यकता नहीं होगी?

मैं आईफोन विकास के लिए नया हूं, और अभी भी उद्देश्य-सी में उपयोग किया जा रहा है, लेकिन मैं दस से अधिक वर्षों से अन्य भाषाओं (जावा, सी #, फ्लेक्स/एक्शनस्क्रिप्ट, आदि) में काम कर रहा हूं, इसलिए मुझे काम पूरा करने की मेरी क्षमता में आत्मविश्वास महसूस होता है, अगर केवल आईफोन एसडीके और इस तरह की चीजों के लिए सामान्य कोडिंग पैटर्न के लिए मुझे बेहतर महसूस होता। क्या यह सिर्फ मुझे है, या एसडीके दस्तावेज वास्तव में चूसना है?

किसी भी तरह, आपकी मदद के लिए धन्यवाद!

+0

मैं SDK दस्तावेज़ बहुत अच्छा लगता है। आप बस उस क्षेत्र में काम कर रहे प्रतीत होते हैं जहां इस समय एसडीके थोड़ा कमजोर है। – zoul

+0

एसडीके दस्तावेज पूर्व-मौजूदा घटकों के समूह को एक साथ जोड़कर ऐप्स बनाने के लिए बहुत अच्छा है। लेकिन कस्टम घटकों के विकास के लिए आवश्यक तकनीकों के दस्तावेज़ीकरण में मेरी कमी है। – benjismith

+0

@benjismith हैलो, मैं भी इस तरह की एक एप्लिकेशन पर काम कर रहा हूँ। मुझे एक एपब फ़ाइल को पार्स करने की ज़रूरत है। क्या आपको इसके बारे में कोई विचार है? आपने पेजिंग कैसे की थी? मेरे पास एकाधिक एक्सएचटीएमएल पेज हैं, मैं यह समझने में असमर्थ हूं कि मैं पेजिंग कैसे करूं? आपकी मदद से सराहना की जाएगी। धन्यवाद –

उत्तर

1

सिर्फ दो यादृच्छिक टिप्पणियों:

  • आप एक पेजिंग इंटरफ़ेस बनाने का खर्च वहन कर सकते हैं? ("अंतहीन स्क्रॉलिंग" के विपरीत।) ऐसा लगता है कि सिस्टम संसाधनों पर एक पेजिंग इंटरफ़ेस बहुत आसान होगा।

  • UIActionBar वास्तव में UIMenuController कक्षा है। इंटरफ़ेस थोड़ा अजीब है, क्योंकि मेनू एक सिंगलटन (wtf?) है, लेकिन मुझे यकीन है कि आपको इसे समझने में कोई परेशानी नहीं होगी।

आशा है कि मदद करता है।

+0

विभिन्न कारणों से, मुझे नहीं लगता कि एक पेजिंग इंटरफ़ेस मेरे ऐप के लिए अच्छा काम करेगा। लेकिन अवधारणात्मक रूप से, एक पेजिंग इंटरफ़ेस जो मैं ढूंढ रहा हूं उसके लगभग समान है: वर्तमान में स्क्रीन पर केवल वही प्रस्तुत करें, जब वे ऑफस्क्रीन का प्रवाह करते हैं, तो रीसायकल तत्वों को प्रस्तुत करें, और एक दृश्य संकेतक (उदाहरण के लिए, एक स्क्रॉलबार) प्रदान करें जो उपयोगकर्ता के वर्तमान स्थान को संदर्भ में दर्शाता है दस्तावेज़। यदि मैं अपने दस्तावेज़ को अनुच्छेदों (ज्ञात आयामों के साथ) की एक लिंक-सूची के रूप में मॉडल करता हूं, तो टुकड़े टुकड़े प्रतिपादन करने के लिए यह छोटा होना चाहिए। लेकिन मैं मंच-मानक स्क्रॉलिंग कार्यक्षमता में कैसे लगा सकता हूं? यही तो प्रश्न है। – benjismith

+0

UIMenuController नाम के सुधार के लिए धन्यवाद। मैंने तदनुसार अपना मूल प्रश्न अपडेट किया है। – benjismith

1

यहां एक संभावित समाधान है, लेकिन मुझे नहीं पता कि यह पागल है या नहीं। चूंकि मैं अभी भी आईफोन विकास के लिए इतना नया हूं, यह एक बड़ा नंबर नहीं हो सकता है।

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

बेशक, मैं कक्षों के बीच लाइन विभाजक से छुटकारा पाना चाहता हूं, क्योंकि मैं चाहता हूं कि यूआई तालिका के बजाय दस्तावेज़ की तरह दिखें।

या शायद मैं एक तालिका सेल के रूप में दस्तावेज़ के प्रत्येक पृष्ठ (एक सामान्य पीडीएफ की तरह, यह एक पेजेड-दस्तावेज़ प्रारूप) प्रस्तुत कर सकता हूं, और सेल-विभाजक ग्राफिक को पृष्ठ सीमा की तरह दिखने के लिए ओवरराइड कर सकता है ...

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

2

क्या आपके दस्तावेज़ में प्रत्येक अनुच्छेद के अलावा कोई अर्थपूर्ण घटक हैं? यदि आपके पास पहले से ही अनुभागों या पृष्ठों की कुछ अवधारणा है, तो मैं आपको उनमें से प्रत्येक को एक स्वतंत्र टेबलसेल के रूप में प्रस्तुत करने की अनुशंसा करता हूं। एक टेबलसेल बनाने के लिए यह बहुत आसान है जो आपको भूल जाता है कि आप वास्तव में UITableView को देख रहे हैं। आपको बस इतना करना होगा कि drawrect ओवरराइड है: और सेट चयनित: और सेट हाइलाइट किया गया: और तह दाह! कोई और सेल डिवाइडर जब तक कि आप उन्हें नहीं चाहते हैं। इसके अलावा आप अपने बेस के रूप में टेबलव्यू का उपयोग करके कुछ निफ्टी चीजें कर सकते हैं। यदि आपने UITableView में अनुभागों को परिभाषित किया है तो आपके पास निफ्टी हेडर हो सकता है जो आपके दस्तावेज़ के माध्यम से पेजिंग के साथ स्क्रॉल करता है।एक और चीज जो आप कर सकते हैं वह है "सेक्शन पर जाएं" बार/एक बुकमार्क मेनू जोड़ें, और इस तरह आपको अनुभागों की सीमाओं में चयन प्रदान करने की आवश्यकता नहीं है।

बड़े पैमाने पर कॉपी पेस्ट ब्लॉक के रूप में अच्छी तरह से सिस्टम पर बहुत दर्दनाक होगा। इसके अलावा, अगर आप इस सामग्री को प्रदान करने में परेशानी से गुज़र चुके हैं तो हो सकता है कि आप किसी के लिए इसे एक बार में कॉपी करने के लिए बहुत आसान बनाना न चाहें ... (आपकी परियोजना पर अधिक विशिष्टताओं के बिना विचार की इस पंक्ति का पालन नहीं कर सकते हैं)।

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

मैं आपको एसडीके दस्तावेज़ों में UITableViewCell UITableViewDelegate और UITableViewDataSource को देखने की सलाह देता हूं क्योंकि यदि आप इस सुझाव का उपयोग करना चुनते हैं तो वे पृष्ठ महत्वपूर्ण रूप से सहायता करेंगे।

+0

मैं उल्लेख करना भूल गया कि प्रतिनिधियों और डेटा स्रोतों के विचार में टेबलव्यू और पूरी तरह डाइविंग का उपयोग करके, आप एक बहुत ही शानदार रूपरेखा दृश्य बना सकते हैं जो दस्तावेज़ में अनुभागों की उपस्थिति को एक शानदार शानदार तरीके से एनिमेट करेगा। – fbartho

+0

एक चीज जो आपके लिए यह जानना बहुत महत्वपूर्ण है कि यदि आप इस मार्ग पर जाते हैं तो टेबलव्यूसेल पुन: उपयोग मॉडल है जिसे प्राथमिक रूप से डेक्यू रिसाइबल कैलविथ इंडेंटिफायर के माध्यम से एक्सेस किया जाता है: और संबंधित init विधि। यह देखते हुए कि आपका दस्तावेज़ इतना बड़ा है कि आप शायद सब कुछ पूर्ववत नहीं करना चाहते हैं। UITableViews कुछ सेल दृश्यों को कैश करके और उस सेल की सामग्री को स्वैप करके उस समस्या को हल करने में मदद करता है जो स्क्रीन पर स्क्रॉल करने के बारे में किसी सेल के लिए सामग्री के साथ थोड़ी देर के लिए ऑफस्क्रीन रहा है। – fbartho

+0

यदि आप पाठ होस्ट करने के लिए NSTextField उप-वर्गों का उपयोग करते हैं तो आप जिस चयन व्यवहार को ढूंढ रहे हैं उसे प्राप्त करने में सक्षम होंगे। – fbartho

0

UIWebView एक अच्छा choise है, लेकिन हम प्रस्तुत करना पृष्ठों percisely प्रत्येक फ़ॉन्ट और प्रत्येक शैली पत्रक का उपयोग कर और एक डेटाबेस तालिका में rendring जानकारी स्टोर करने के लिए पूर्व किसी अन्य अनुप्रयोग की जरूरत है:

chapter_id पूर्णांक प्राथमिक कुंजी,
startlocation पूर्णांक,
अंत स्थान पूर्णांक,
fontsize पूर्णांक (या stylesheetname स्ट्रिंग)

का उपयोग जावास्क्रिप्ट गणना कर सकते हैं कि कितने शब्दों को स्क्रॉल के साथ एक div में फिट।

UIWebView अच्छा है के रूप में यह अमीर सामग्री उपलब्ध कराने और यह चयन और प्रकाश डाला व्यवहार है।

उम्मीद है कि इससे मदद मिलती है।

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