2012-05-05 10 views
33

ऑटो लेआउट यह एक पाठ क्षेत्र (और इसलिए एक लेबल) पाठ यह धारण के साथ विकसित करने देने के लिए काफी सरल बनाना चाहिए।ऑटो लेआउट में टेक्स्ट के साथ NSTextField कैसे बढ़ने दें? शेर में

पाठ क्षेत्र इंटरफ़ेस बिल्डर में रैप करने के लिए निर्धारित है।

यह करने के लिए एक सरल और विश्वसनीय तरीका क्या है?

उत्तर

42

NSView में यह तरीका देता है कि दृश्य स्वयं आंतरिक सामग्री आकार के रूप में क्या सोचता है।

NSTextField अपने सेल की wraps संपत्ति पर विचार किए बिना इसकी गणना करता है, इसलिए यह एक पंक्ति में रखे गए पाठ के आयामों की रिपोर्ट करेगा।

-(NSSize)intrinsicContentSize 
{ 
    if (![self.cell wraps]) { 
     return [super intrinsicContentSize]; 
    } 

    NSRect frame = [self frame]; 

    CGFloat width = frame.size.width; 

    // Make the frame very high, while keeping the width 
    frame.size.height = CGFLOAT_MAX; 

    // Calculate new height within the frame 
    // with practically infinite height. 
    CGFloat height = [self.cell cellSizeForBounds: frame].height; 

    return NSMakeSize(width, height); 
} 

// you need to invalidate the layout on text change, else it wouldn't grow by changing the text 
- (void)textDidChange:(NSNotification *)notification 
{ 
    [super textDidChange:notification]; 
    [self invalidateIntrinsicContentSize]; 
} 
+2

यह ठीक है कि मैं क्या देख रहा हूँ से मेल खाता है। बस स्पष्ट करने के लिए, सेल पर 'लपेटें' संपत्ति की यह अनदेखी शेर में एक बग प्रतीत होती है जिसे माउंटेन शेर में तय किया गया है। इसलिए, यदि आप शेर को लक्षित कर रहे हैं और ऊपर आप 2 ओएस में अलग-अलग परिणाम देखेंगे जब तक कि आप शेर को गति तक लाने के लिए बगफिक्स लागू नहीं करते। –

+0

हां, यह शेर में एक बग है। मैं वास्तव में चाहता हूं कि ऐप्पल इन मुद्दों को ओएस एक्स 10.7 और 10.8 दोनों में ठीक करे। मेरे कार्यान्वयन में, मैं विशेष मामलों के लिए कुछ और जांच करता हूं (उदाहरण के लिए यदि यह शेर है || यदि भाषा अंग्रेजी नहीं है) और मैंने अपनी ऊंचाई को थोड़ा अलग सेट किया है। फिर भी, जो मोनोलो पोस्ट किया गया वह एक अच्छी शुरुआत है। – Arvin

+2

आंतरिक सामग्री सामग्री: जब आप setStringValue द्वारा टेक्स्ट को बदलते हैं तो विधि को कॉल नहीं किया जाता है:। – ideawu

1

स्वीकार किए जाते हैं जवाब intrinsicContentSize लेकिन यह है कि हो सकता है जोड़ तोड़ पर आधारित है:

इसलिए, NSTextField के एक कस्टम उपवर्ग इस विधि ओवरराइड कर सकते हैं इस तरह के सेल की cellSizeForBounds: विधि द्वारा प्रदान की एक के रूप में एक बेहतर मान देने के लिए, सभी मामलों में जरूरी नहीं है। Autolayout बढ़ने और पाठ क्षेत्र की ऊंचाई हटना यदि (a) आप पाठ क्षेत्र एक preferredMaxLayoutWidth देने के लिए और (ख) क्षेत्र नहीं editable कर देगा। ये चरण टेक्स्ट फ़ील्ड को अपनी आंतरिक चौड़ाई निर्धारित करने और ऑटोलायआउट के लिए आवश्यक ऊंचाई की गणना करने में सक्षम करते हैं। अधिक जानकारी के लिए this answer और this answer देखें।

इससे भी अधिक प्रच्छन्नतापूर्वक, यह पाठ क्षेत्र के कि autolayout editable विशेषता पर निर्भरता से इस प्रकार यदि आप मैदान पर बाइंडिंग का उपयोग कर रहे हैं और Conditionally Sets Editable विकल्प स्पष्ट करने के लिए असफल टूट जाएगा।

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