2013-06-16 7 views
6

मुझे यकीन है कि क्या मेरे विकल्प निम्न कार्य के लिए कर रहे हैं नहीं कर रहा हूँ के लिए जिम्मेदार ठहराया।गतिशील पाठ

क्या मुझे NSAttributedString का उपयोग करना चाहिए और विशेषता को लागू करने के लिए गतिशील अनुक्रमणिका और लंबाई का पता लगाना चाहिए?

या क्या प्रत्येक शब्द को अपने स्वयं के लेबल से पहले करना संभव है? (मुझे यकीन नहीं है कि क्या एकाधिक लेबल इनलाइन रखना संभव है और प्रत्येक व्यक्ति को आकार बढ़ने के साथ बाकी को दाएं हाथ में डाल दिया जाता है, जैसे एचटीएमएल/सीएसएस में फ़्लोटिंग काम करता है)

+0

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

उत्तर

21

सबसे अच्छा विकल्प निश्चित रूप से है एक लेबल में एक भी NSAttributedString साथ ऐसा करते हैं, क्योंकि अपने अन्य विकल्प हैं:

  1. उपयोग एकाधिक लेबल, उनके फ्रेम, हर बार कुछ बदल जाता है बदलने के लिए उन्हें चारों ओर ले जाने, वास्तव में कैसे विस्तृत एक अंतरिक्ष होना चाहिए यह पता लगाने, कर सुनिश्चित करें कि वे स्क्रीन के लिए बहुत व्यापक नहीं हैं या इन्हें देखना चाहिए, आदि। जैसा कि आप देख सकते हैं, यह बहुत दर्दनाक हो जाएगा।

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

यदि आप एक ही स्ट्रिंग का उपयोग जबकि, सब आप सही तरीके से विशेषताओं के लिए पर्वतमाला की गणना करना है, आवंटितको विशेषता स्ट्रिंग 210 के attributedText (नोट, आईओएस 6+ केवल, लेकिन आपके प्रश्न पर टैग द्वारा निर्णय लेना जो आपके लिए कोई समस्या नहीं है), और आप कर चुके हैं। मैं वर्तमान में अपने ऐप में काफी व्यापक रूप से इस दृष्टिकोण का उपयोग कर रहा हूं, और यह थोड़ी देर के लिए अच्छी तरह से काम कर रहा है (I इस पर बसने से पहले दो अन्य कोशिश करें, और वे काम करने के लिए काफी दर्दनाक थे)।

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 50, 300, 50)]; 
label.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:16.0]; 
[self.view addSubview:label]; 

NSString *category = @"Socks"; 
NSString *store = @"Apple Store"; 

NSMutableAttributedString *string = [[NSMutableAttributedString alloc] 
             initWithString:[NSString stringWithFormat: 
             @"in %@ at %@ — 1 day ago", 
              category, store]]; 

[string addAttribute:NSForegroundColorAttributeName 
       value:[UIColor redColor] 
       range:[string.string rangeOfString:category]]; 
[string addAttribute:NSForegroundColorAttributeName 
       value:[UIColor redColor] 
       range:[string.string rangeOfString:store]]; 

label.attributedText = string; 

ध्यान रहे कि यदि अपेक्षा के अनुरूप काम नहीं होगा, उदाहरण के लिए, store और category का मूल्य हैं:

यहाँ एक जिम्मेदार ठहराया स्ट्रिंग का उपयोग ऐसा करने का एक बहुत ही बुनियादी उदाहरण है वही, चूंकि rangeOfString: दिए गए स्ट्रिंग की पहली घटना पायेगा, जिसका अर्थ है कि श्रेणी स्ट्रिंग को दो बार हाइलाइट किया जा सकता है, और स्टोर स्ट्रिंग बिल्कुल नहीं है।

बेहतर उदाहरण:

NSString *in = @"in "; 
NSString *category = @"in"; 
NSString *at = @" at "; 
NSString *store = @"in"; 

NSString *text = [NSString stringWithFormat:@"%@%@%@%@ — 1 day ago", 
              in, category, at, store]; 
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] 
             initWithString:text]; 

[string addAttribute:NSForegroundColorAttributeName 
       value:[UIColor redColor] 
       range:NSMakeRange(in.length, category.length)]; 
[string addAttribute:NSForegroundColorAttributeName 
       value:[UIColor redColor] 
       range:NSMakeRange(in.length + category.length + at.length, 
           store.length)]; 

: यहाँ एक से थोड़ा अधिक उन्नत उदाहरण है कि, क्योंकि बराबर तार के तोड़ने नहीं होगा मैन्युअल रूप से पर्वतमाला की गणना करने के लिए होने का जोड़ा झुंझलाहट के साथ यद्यपि है इस तरह हमेशा सही तरीके से काम करेगा, भले ही आपके सभी तार बराबर हों, फिर भी यह थोड़ा अधिक लंबा कोड-वार है क्योंकि आपको हाइलाइट करने के लिए श्रेणियों की मैन्युअल रूप से गणना करना है (हालांकि यह फिर से नहीं है y एक प्रमुख मुद्दा या पूर्ण शब्दों में बहुत सारे कोड)।

अद्यतन: बस एक बोल्ड फ़ॉन्ट प्रयोग करने के लिए एक सरल उदाहरण जोड़ने, तो आप इसे देखने के लिए की जरूरत नहीं है:

[string addAttribute:NSFontAttributeName 
       value:[UIFont fontWithName:@"HelveticaNeue-Bold" size:16.0] 
       range:NSMakeRange(in.length, category.length)]; 
[string addAttribute:NSFontAttributeName 
       value:[UIFont fontWithName:@"HelveticaNeue-Bold" size:16.0] 
       range:NSMakeRange(in.length + category.length + at.length, 
           store.length)]; 

अधिक विशेषताओं के लिए NSAttributedStringUIKit Additions Reference पर एक नज़र डालें कि आप जिस प्रभाव को चाहते हैं उसे प्राप्त करने के लिए आप स्ट्रिंग में जोड़ सकते हैं।

+1

सभी संभावनाओं को समझाने के लिए बहुत बहुत धन्यवाद, भले ही वे ' सर्वोत्तम समाधान नहीं है। अच्छे और विस्तृत उत्तर के लिए –

+0

+1! – Paaske

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