2010-02-17 10 views
6

मैं एक NSTextView और मैं आवश्यकताओं में से एक के साथ काम कर रहा हूँ की चौड़ाई के साथ तैयार कर रहे हैं कि एक टैब वर्ण, '\ t', एक ही होगा है चार रिक्त स्थान के रूप में चौड़ाई।कैसे इतना है कि मेरी टैब वर्ण 4 अक्षर

तो पाठ-सामग्री इस प्रकार दिखाई देगा:

AAAA 
    AAAA - 1 tab 
    AAAA - 4 spaces 

और यह मैं यह कैसे पूरा है:

// done when NSTextView first loaded and when 
// delegate's textDidBeginEditing gets called: (perhaps overkill, but is a work in progress). 
- (void)updateMyTextViewTextAttributes 
{ 
    NSMutableParagraphStyle* paragraphStyle = [[myTextView defaultParagraphStyle] mutableCopy]; 
    if (paragraphStyle == nil) { 
     paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; 
    } 
    float charWidth = [[myFont screenFontWithRenderingMode:NSFontDefaultRenderingMode] advancementForGlyph:(NSGlyph) ' '].width; 
    [paragraphStyle setDefaultTabInterval:(charWidth * 4)]; 
    [paragraphStyle setTabStops:[NSArray array]]; 
    [myTextView setDefaultParagraphStyle:paragraphStyle]; 

    NSMutableDictionary* typingAttributes = [[myTextView typingAttributes] mutableCopy]; 
    [typingAttributes setObject:paragraphStyle forKey:NSParagraphStyleAttributeName]; 
    [typingAttributes setObject:scriptFont forKey:NSFontAttributeName]; 
    [myTextView setTypingAttributes:typingAttributes]; 
} 

यह उचित लेआउट की अनुमति देता है और साथ ही प्रारंभिक पाठ के साथ दिखाया जा सकता है जैसे टाइपिंग गुणों को वही रखें।

समस्या यह है कि अंत उपयोगकर्ता फॉन्ट बदल सकता है। और जब ऐसा होता है, नमूना पाठ misaligned हो जाता है। बहुत नीचे की तरह:

[smaller font] 
AAAA 
    AAAA - 1 tab 
    AAAA - 4 spaces 


[larger font] 
AAAA 
    AAAA - 1 tab 
    AAAA - 4 spaces 

मैं myTextView के setNeedsDisplay बुला की कोशिश की है: हाँ के रूप में मैंने पढ़ा है कि यह NSTextView के setNeedsDisplayInRect बुला समाप्त होता है: avoidAdditionalLayout पैरामीटर के लिए कोई नहीं के साथ avoidAdditionalLayout। यह कुछ भी नहीं बदला है।

मैं बुला मेरी updateMyTextViewTextAttributes फोन जब myTextView नई myFont सेट है की कोशिश की है। यह एक चीज़ नहीं बदलता है।

मैंने myTextView के पाठक के पाठ के लिए LayoutForTextContainer सुनिश्चित करने के लिए myTextView के लेआउट प्रबंधक को यह भी करने का प्रयास किया है। कोई परिवर्तन नहीं होता है।

इस बिंदु पर, मुझे यकीन है कि आगे क्या करने की कोशिश करना नहीं हूँ। कोई सुझाव?

उत्तर

3

डगलस एप्पल की डेविडसन [email protected] ईमेल सूची के माध्यम से जवाब देने के लिए प्राप्त करने के लिए clues के साथ मुझे प्रदान की है।

मैं अद्यतन करने updateMyTextViewTextAttributes इसलिए की तरह कार्य से समस्या हल हो गई है:

- (void)updateMyTextViewTextAttributes 
{ 
   NSMutableParagraphStyle* paragraphStyle = [[myTextView defaultParagraphStyle] mutableCopy]; 

   if (paragraphStyle == nil) { 
       paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; 
   } 

   float charWidth = [[myFont screenFontWithRenderingMode:NSFontDefaultRenderingMode] advancementForGlyph:(NSGlyph) ' '].width; 
   [paragraphStyle setDefaultTabInterval:(charWidth * 4)]; 
   [paragraphStyle setTabStops:[NSArray array]]; 

   [myTextView setDefaultParagraphStyle:paragraphStyle]; 

   NSMutableDictionary* typingAttributes = [[myTextView typingAttributes] mutableCopy]; 
   [typingAttributes setObject:paragraphStyle forKey:NSParagraphStyleAttributeName]; 
   [typingAttributes setObject:scriptFont forKey:NSFontAttributeName]; 
   [myTextView setTypingAttributes:typingAttributes]; 

    /** ADDED CODE BELOW **/ 
   NSRange rangeOfChange = NSMakeRange(0, [[myTextView string] length]); 
   [myTextView shouldChangeTextInRange:rangeOfChange replacementString:nil]; 
   [[myTextView textStorage] setAttributes:typingAttributes range:rangeOfChange]; 
   [myTextView didChangeText]; 

    [paragraphStyle release]; 
    [typingAttributes release]; 
} 
1

आप सीधे फॉन्ट के बजाय स्क्रीन फॉन्ट पर advancementForGlyph: के साथ अंतरिक्ष उन्नति की गणना करने की कोशिश की है?

float charWidth = [myFont advancementForGlyph:(NSGlyph) ' '].width; 

स्क्रीन फ़ॉन्ट खिड़की सर्वर के बाहर सीधे इस्तेमाल किया जा नहीं होती हैं:

स्क्रीन फोंट के साथ ही खिड़की सर्वर प्रत्यक्ष उपयोग के लिए कर रहे हैं। एप्लिकेशन किट ऑब्जेक्ट्स के साथ उन्हें का उपयोग न करें, जैसे सेटफॉन्ट: विधियों में। आंतरिक रूप से, आवेदन किट स्वचालित रूप से इसी स्क्रीन फ़ॉन्ट एक फ़ॉन्ट वस्तु के लिए जब तक दृश्य नहीं घुमाया या बढ़ाया है के रूप में उपयोग करता है।

+0

मैं कोड की धारा पाया: "[[myFont screenFontWithRenderingMode: NSFontDefaultRenderingMode] advancementForGlyph: (NSGlyph) '']। चौड़ाई;" प्रोग्रामरेटिक निर्दिष्ट टैब-चौड़ाई को संभालने के लिए वर्णित कुछ कोड में ऑनलाइन।अगर मैं इसे केवल "[myFont advancementForGlyph: (NSGlyph) ']। Width;", लाइनें अब मेल नहीं खाती हैं। आपने दस्तावेज़ से उद्धृत किया है, लेकिन इसमें वही वांछित कार्यक्षमता नहीं है ... –

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