2013-09-22 10 views
12

के बीच NSAttributedString हाइलाइट/पृष्ठभूमि रंग शो दिखाता है मैं NSTextView में हाइलाइट किए गए अनुच्छेदों को अच्छी तरह प्रदर्शित करने की कोशिश कर रहा हूं। अभी, मैं एक पृष्ठभूमि रंग के साथ एक NSAttributedString बनाकर कर रहा हूँ।लाइनों (बदसूरत)

NSDictionary *attributes = @{NSBackgroundColorAttributeName:NSColor.greenColor}; 
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:@"Here is a single line of text with single spacing" attributes:attributes]; 

[textView.textStorage setAttributedString:attrString]; 

यह दृष्टिकोण मूल रूप से काम करता है, यह है कि यह प्रकाश डाला पाठ का उत्पादन में यहाँ कुछ सरल कोड है।

Single line single spaced

दुर्भाग्य से, जब कई पंक्तियों मौजूद हैं, उजागर ऊर्ध्वाधर अंतरिक्ष के बीच लाइनों के लिए खुद को लाइनों के अलावा, कुरूपता में जिसके परिणामस्वरूप को शामिल किया गया।

Multi line double spaced text

किसी कोको में प्रकाश डाला इस तरह का करने के लिए एक तरीका है पता है?

whiteout text

मैं चीजों को अच्छे लग रहे बनाने के लिए CoreText, एचटीएमएल, या जो कुछ भी आवश्यक है का उपयोग करने के लिए तैयार हो जाएगा: नीचे चित्र मूल रूप से मैं के लिए (सफेद बक्से पर छाया की उपेक्षा) क्या देख रहा हूँ है ।

+2

क्या आपने कभी यह हल किया है, मुझे बिल्कुल एक ही समस्या है – user499846

+1

मुझे यह वास्तव में नहीं पता था, लेकिन मुझे पता चला कि कम से कम पाठ के चारों ओर चयन रेक्ट को कैसे केंद्रित किया जाए, ताकि यह सब ऊपर या नीचे। इसमें '[पैराग्राफ स्टाइल सेटलाइन स्पेसिंग: एक्सएक्स]' और '[पैराग्राफ स्टाइल सेटलाइन हाइटमल्टी: एक्सएक्स]' की गणना करना शामिल है, जैसे कि वे वही हैं। फिर, यह वास्तविक समस्या को हल नहीं करता है, हालांकि यह और अधिक सहनशील बनाता है। – stevel

उत्तर

0

इस प्रयास करें: -

 -(IBAction)chooseOnlylines:(id)sender 
{ 

NSString *allTheText =[tv string]; 
    NSArray *lines = [allTheText componentsSeparatedByString:@"\n"]; 
    NSString *str=[[NSString alloc]init]; 
    NSMutableAttributedString *attr; 
    BOOL isNext=YES; 
    [tv setString:@""]; 
    for (str in lines) 
    { 
     attr=[[NSMutableAttributedString alloc]initWithString:str]; 
     if ([str length] > 0) 
     { 

     NSRange range=NSMakeRange(0, [str length]); 
     [attr addAttribute:NSBackgroundColorAttributeName value:[NSColor greenColor] range:range]; 
     [tv .textStorage appendAttributedString:attr]; 
      isNext=YES; 
     } 
     else 
     { 
      NSString *[email protected]"\n"; 
      NSAttributedString *attr=[[NSAttributedString alloc]initWithString:str]; 
      [tv .textStorage appendAttributedString:attr]; 
      isNext=NO; 
     } 
     if (isNext==YES) 
     { 
      NSString *[email protected]"\n"; 
      NSAttributedString *attr=[[NSAttributedString alloc]initWithString:str]; 
      [tv .textStorage appendAttributedString:attr]; 

     } 
    } 
} 
+0

दुर्भाग्य से इस मामले में, रेखाएं \ n वर्णों से अलग नहीं होती हैं - यह एक अनुच्छेद है, इसलिए पाठ स्वचालित रूप से लपेटा जाता है। हालांकि, प्रयास के लिए धन्यवाद। – stevel

+0

मैंने कोड संशोधित किया है। कृपया अभी आज़माएं और यह शब्द को मिटा नहीं देगा। –

2

आप NSLayoutManager उपवर्ग और ओवरराइड करने के लिए की आवश्यकता होगी:

- (void)fillBackgroundRectArray:(const CGRect *)rectArray 
         count:(NSUInteger)rectCount 
      forCharacterRange:(NSRange)charRange 
         color:(UIColor *)color; 

यह पृष्ठभूमि रंग आयतों की बैठक के लिए आदिम तरीका है।

+1

विधि, सुप्रा, आप कैसे लागू करते हैं, आपके आवेदन के लिए विशिष्ट होने जा रहा है। (NSRange) glyphRange usingBlock: (शून्य (^) (CGRect रेक्ट, CGRect usedRect, NSTextContainer * textContainer, NSRange glyphRange, BOOL * बंद)) block' (शून्य) enumerateLineFragmentsForGlyphRange - लेकिन, अतिरिक्त संदर्भ के रूप में, मैं 'इस्तेमाल किया सीजीआरईटीई structs की एक सरणी बनाने के लिए जो वर्ण ग्लिफ द्वारा उपयोग की गई सीमाओं का वर्णन करता है, और मेरे हाइलाइट की सीमाओं को प्रतिबंधित करने के लिए rectArray सामग्री के साथ छेड़छाड़ की गई है। – nzeltzer

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