2011-12-18 17 views
23

मुझे रसायन शास्त्र सूत्रों (एच 2 ओ, ना^2 +, आदि) के लिए सबस्क्रिप्ट बनाने की आवश्यकता है?NSAttributedString का उपयोग कर सबस्क्रिप्ट और सुपरस्क्रिप्ट कैसे बनाएं?

क्या यह एनएसएट्रिब्यूटेड स्ट्रिंग के साथ करना संभव है, या क्या सदस्यता लेने के लिए कोई वैकल्पिक/आसान तरीका है?

उत्तर

28

NSAttributedString के साथ ऐसा करना संभव है। जो विशेषता आप खोज रहे हैं वह आपके प्लेटफॉर्म पर निर्भर करती है। मैक ओएस एक्स के लिए यह NSSuperscriptAttributeName है और आईओएस पर यह kCTSuperscriptAttributeName है। सबस्क्रिप्ट के लिए नकारात्मक मान में पास करें।

एकमात्र चेतावनी यह है कि UILabel आईओएस पर NSAttributedString एस नहीं खींच सकता है (फिर भी, उंगलियों 6 आईओएस के लिए पार हो गया)। आपको कोर टेक्स्ट का उपयोग करके टेक्स्ट खींचना होगा या UILabel के लिए कुछ तृतीय पक्ष प्रतिस्थापन ढूंढना होगा जो NSAttributedString आकर्षित कर सकता है।

+0

धन्यवाद। क्या आप सुपरस्क्रिप्ट्स को भी बनाने के लिए kCTSuperscriptAttributeName का उपयोग कर सकते हैं? – Mahir

+1

हां जैसा कि मैंने कहा है, सुपरस्क्रिप्ट के लिए एक सकारात्मक मूल्य है। सबस्क्रिप्ट के लिए एक नकारात्मक मूल्य। –

+0

क्षमा करें, मुझे नहीं पता कि मुझे यह कैसे याद आया। एक बार फिर धन्यवाद। – Mahir

33

यहां मैंने आईओएस 6 में क्या किया है। पहले कोरटेक्स्ट, और क्वार्ट्जकोर फ्रेमवर्क जोड़ें। फिर आयात:

#import <QuartzCore/QuartzCore.h> 
#import <CoreText/CTStringAttributes.h> 
#import <CoreText/CoreText.h> 

मैं एक छोटे से समारोह है कि एक सादे NSString इनपुट और सुपरस्क्रिप्ट के अंतिम वर्ण के साथ एक NSMutableAttributedString निर्यात कर दिया। इसे सुपरस्क्रिप्ट या सबस्क्रिप्ट सेट करने की अनुमति देने के लिए संशोधित किया जा सकता है, kCTSuperscriptAttributeName मान -1 को बदलें। स्ट्रिंग में सुपरस्क्रिप्ट को कहां रखना है, यह निर्दिष्ट करने के लिए आप एक चर जोड़ सकते हैं। अभी यह सिर्फ स्ट्रिंग के अंत को मानता है।

- (NSMutableAttributedString *)plainStringToAttributedUnits:(NSString *)string; 
{ 
    NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:string]; 
    UIFont *font = [UIFont systemFontOfSize:10.0f]; 
    UIFont *smallFont = [UIFont systemFontOfSize:9.0f]; 

    [attString beginEditing]; 
    [attString addAttribute:NSFontAttributeName value:(font) range:NSMakeRange(0, string.length - 2)]; 
    [attString addAttribute:NSFontAttributeName value:(smallFont) range:NSMakeRange(string.length - 1, 1)]; 
    [attString addAttribute:(NSString*)kCTSuperscriptAttributeName value:@"1" range:NSMakeRange(string.length - 1, 1)]; 
    [attString addAttribute:(NSString*)kCTForegroundColorAttributeName value:[UIColor blackColor] range:NSMakeRange(0, string.length - 1)]; 
    [attString endEditing]; 
    return attString; 
} 

अब मैं क्या कर सकते हैं जब मैं इसका उपयोग करना चाहते एक UITextField में रख लिए निम्न:

NSString *qlwUnitsPlainText = @"m3"; 
    self.quantityLoadWeightUnits_textField.attributedText = [self plainStringToAttributedUnits:qlwUnitsPlainText]; 

मुझे आशा है कि यह किसी और में मदद करता है, वहाँ कई उदाहरण नहीं है!

+0

क्या आप कृपया जिम्मेदार स्ट्रिंग के इस हिस्से को देख सकते हैं: https://gist.github.com/mladjan/6663691 सुपरस्क्रिप्ट प्रस्तुत नहीं करना चाहता :( – dormitkon

+3

आपको यह नहीं करना चाहिए कि NSMakeRange पैरामीटर पहले हैं और लंबाई (इसके बजाए पहली स्थिति और अंतिम स्थिति)। उदाहरण में पाठक गुमराह हो सकता है। – dwbrito

+0

मैं इसे कैसे हटा सकता हूं –

0

आप भी कर सकते हैं आप इसे एक से थोड़ा क्लीनर

NSDictionary *attr = @{ NSFontAttributeName: smallfont, 
         (NSString*)kCTSuperscriptAttributeName: @1 } 

NSRange fabricWeightRange = NSMakeRange(fabricWeight.location + 2, 1);     
[subKeyString setAttributes:attr range:fabricWeightRange]; 
5

iOS पर करना चाहते हैं, मैं kCTSuperscriptAttributeName निरंतर याद किया लेकिन फ़ॉन्ट आकार और "आधारभूत" अच्छे परिणाम मिले थे था। यह आप एक छोटे से अधिक नियंत्रण भी कम आज्ञाकारी फोंट के लिए देता है:

+ (NSAttributedString *)attributedStringForText:(NSString *)normalText andSuperscript:(NSString *)superscriptText textSize:(CGFloat)textSize 
{ 
    UIFont *normalFont = [Styles mainFontWithSize:textSize]; 
    UIFont *superFont = [Styles mainFontWithSize:textSize/2]; 

    NSMutableAttributedString *finalStr = [[NSMutableAttributedString alloc] initWithString:normalText attributes:@{NSFontAttributeName: normalFont}]; 

    NSAttributedString *superStr = [[NSAttributedString alloc] initWithString:superscriptText attributes:@{NSFontAttributeName: superFont, NSBaselineOffsetAttributeName:@(textSize/2)}]; 

    [finalStr appendAttributedString:superStr]; 

    return finalStr; 
}  
+0

बहुत धन्यवाद @hari – Ramdy

+0

यहां 'स्टाइल' क्या है? –

+0

@ आदिलकेश्वानी फोंट, आकार, रंगों को केंद्रीकृत करने के लिए बस एक स्थिर वर्ग है, और ऐप से संबंधित अन्य शैलियों। –

0

@ -1 के रूप में kCTSuperscriptAttributeName के लिए सबस्क्रिप्ट उपयोग मूल्य के लिए।

दस्तावेज़ के अनुसार

@discussion मूल्य एक CFNumberRef होना चाहिए। डिफ़ॉल्ट int मान 0 है। यदि निर्दिष्ट फ़ॉन्ट द्वारा समर्थित है, तो 1 का मान सुपरस्क्रिप्टिंग सक्षम करता है और -1 का मान सबस्क्रिप्टिंग को सक्षम बनाता है।

बाहरी कॉन्स CFStringRef kCTSuperscriptAttributeName CT_AVAILABLE (10_5, 3_2);

Example- [lblHeader setText:@“Headers [Alpha1 – text”]; 

     NSMutableAttributedString *headerSubscript = [[NSMutableAttributedString alloc]initWithAttributedString: lblHeader.attributedText]; 

     [headerSubscript addAttribute:(NSString *)kCTSuperscriptAttributeName value:@-1 range:NSMakeRange(14,1)];  

     [lblHeader setAttributedText:headerSubscript]; 
+0

@ भार्गव राव यह तेजी से है, इसलिए मैंने यह जवाब क्यों लिखा है। –

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