2013-01-20 40 views
7

मैं यह कैसे प्रदर्शन करने के लिए पर चारों ओर खोज की है, लेकिन मैं किसी भी सवाल का जवाब नहीं मिल रहा।
मुझे पता है कि अगर मेरे NSTextfield पहले से ही अपने stringValue की लंबाई की जांच किए बिना पाठ (... अंत में) छोटा है चाहते हैं। मुझे यह जानने के लिए यह करना है कि मुझे अपने NSTextfield (एक साधारण लेबल की तरह अभिनय) पर टूलटिप सेट करना चाहिए या नहीं।
कारण मैं अपने टेक्स्टफील्ड की stringValue की लंबाई की जांच नहीं करना चाहता क्योंकि ऐसा कुछ वर्ण हैं जो दूसरों की तुलना में अधिक जगह पर कब्जा करते हैं, इसलिए यह बहुत सटीक नहीं है
धन्यवाद!अगर NSTextfield पहले से ही पाठ (... अंत में) छोटा है कैसे की जाँच करने के

उत्तर

4

आपका सबसे अच्छा शर्त एक NSTextField के बजाय एक NSTextView उपयोग करने के लिए हो सकता है। आप एक NSTextView का उपयोग करते हैं आप textContainer संपत्ति का उपयोग कर NSTextView की NSTextContainer मिल सकती है। कंटेनर आपको containerSize (टेक्स्ट जिस स्थान पर खींचा गया है) बता सकता है।

NSString वस्तुओं विधि sizeWithAttributes: का जवाब। दिए गए गुणों के साथ खींचे जाने पर पाठ की चौड़ाई को पकड़ने के लिए आप परिणामी NSSize संरचना का उपयोग कर सकते हैं। यह पता लगाने के लिए कि कौन से गुण प्रासंगिक हैं, NSAttributedString Application Kit Additions Reference के "कॉन्स्टेंट्स" अनुभाग देखें।

यदि containerSize चौड़ाई sizeWithAttributes: चौड़ाई से कम है तो टेक्स्ट छोटा कर दिया जाएगा।

संपादित करें: क्षमा याचना, यह कोई lineFragmentPadding के साथ ही सही है, लेकिन डिफ़ॉल्ट lineFragmentPadding गैर-शून्य है। या तो containerSize.width से textContainer.lineFragmentPadding घटाना या 0 के लिए सेट करने के लिए NSTextContainersetLineFragmentPadding: विधि का उपयोग करें।

मैं तुम्हें के बारे में भी NSTextField के आकार के पाठ क्षेत्र रिश्तेदार कुछ मान्यताओं बनाने के लिए और उस के साथ संयोजन के रूप में sizeWithAttributes:NSString विधि इस्तेमाल कर सकते हैं लगता है, लेकिन यह है कि के रूप में साफ नहीं है।

संपादित करें 2: मुझे एहसास हुआ कि मैं दीर्घवृत्त का उपयोग करके पाठ छोटा में ओपी के हित को संबोधित नहीं किया। नीचे दिया गया उदाहरण कोड NSTextView में छंटनी का उपयोग करता है। मैंने यह भी सोचा कि मैं कुछ कोड में भी फेंक सकता हूं जो NSTextView को NSTextField में NSBox के अंदर डालकर थोड़ा और समान दिखता है। एक टूलटिप प्रदर्शित किया जाना चाहिए या नहीं, यह निर्धारित करने के लिए आकार के लिए एक चेक जोड़ना ऊपर उल्लिखित जानकारी का उपयोग कर नीचे दिए गए कोड के लिए एक साधारण जोड़ होगा।

NSString* string = @"Hello World."; 

// get the size the text will take up using the default font 
NSSize textBounds = [string sizeWithAttributes:@{}]; 

// Create a border view that looks more or less like the border used around 
// text fields 
NSBox* borderView = [[NSBox alloc] initWithFrame:NSMakeRect(10, 10, 60, textBounds.height+4)]; 
[borderView setBoxType:NSBoxCustom]; 
[borderView setBorderType:NSBezelBorder]; 
[borderView setContentViewMargins:NSMakeSize(0, 0)]; 
[borderView setFillColor:[NSColor whiteColor]]; 

// Create the text view 
NSTextView* textView = [[NSTextView alloc] initWithFrame:NSMakeRect(0, 0, 60, textBounds.height)]; 
[textView setTextContainerInset:NSMakeSize(2, 0)]; 
[textView.textContainer setLineFragmentPadding:0]; 
[textView setEditable:YES]; 

// Set the default paragraph style so the text is truncated rather than 
// wrapped 
NSMutableParagraphStyle* parStyle = [[NSMutableParagraphStyle alloc] init]; 
[parStyle setLineBreakMode:NSLineBreakByTruncatingTail]; 

// Do not let text get squashed to fit 
[parStyle setTighteningFactorForTruncation:0.0]; 

[textView setDefaultParagraphStyle:parStyle]; 
[parStyle release]; 

// Set text 
[textView setString:string]; 

// add NSTextView to border view 
[borderView addSubview:textView]; 
[textView release]; 

// add NSBox to view you want text view displayed in 
[self addSubview:borderView]; 
[borderView release]; 
+0

ध्यान रखें कि यदि यह छोटा बिना फिटिंग के काफी करीब है कि NSTextField थोड़ा पाठ हटना होगा। [इन दोनों टेक्स्ट फ़ील्ड में एक ही आकार का फ़ॉन्ट है।] (Http://i.stack.imgur.com/wrJtj.png) –

+1

@ जॉन सोयर अच्छा बिंदु। यह वास्तव में NSTextViews के लिए भी होता है। यह छंटनी से पहले अक्षर को एक साथ स्थानांतरित करने का प्रयास करने के लिए छेड़छाड़ करने वाले एल्गोरिदम का डिफ़ॉल्ट व्यवहार है। मेरे दूसरे संपादन में मैं इसे 'सेटटाइटिंग फैक्टर फॉरट्रुनेशन:' विधि 'एनएसएमयूटेबल पैराग्राफ स्टाइल' वर्ग का उपयोग करके होने से रोकता हूं। – Mathew

+0

आपके उत्तर के लिए धन्यवाद, मैं इसे एप की कोशिश करूंगा और मैं आपको बता दूंगा –

0

मुझे लगता है कि आप टेक्स्ट फ़ील्ड के फील्ड एडिटर के फ्रेम को देख कर ऐसा कर सकते हैं। आप नियंत्रण में अपनी चौड़ाई की जांच करें टेक्स्टडिडबीज एडिटिंग, और फिर नियंत्रण में फिर से टेक्स्टडिड एंड एडिटिंग। यदि बाद वाला मान बड़ा है, तो पाठ को छोटा कर दिया गया है। निम्नलिखित पाठ क्षेत्र के प्रतिनिधि में कार्यान्वित किया जाता (मैं initialWidth के लिए एक इवर बनाई गई):

- (void)controlTextDidBeginEditing:(NSNotification *)aNotification { 
    if (! initialWidth) 
     initialWidth = ((NSTextView *)aNotification.userInfo[@"NSFieldEditor"]).frame.size.width; 
} 


- (void)controlTextDidEndEditing:(NSNotification *)aNotification { 
    if (initialWidth) { //Make sure that beginEditing is called first 
     NSInteger finalWidth = ((NSTextView *)aNotification.userInfo[@"NSFieldEditor"]).frame.size.width; 
     if (finalWidth - initialWidth > 1) NSLog(@"We have truncation"); 
     NSLog(@"Final: %ld Initial: %ld", finalWidth,initialWidth); 
    } 
} 

यह समय के सबसे अधिक काम करने के लिए अगर आप एक लंबी श्रृंखला में टाइप सहित, फिर हटाने जब तक यह फिर से फिट बैठता है लगता है। कुछ मामलों में, जब मैंने टेक्स्ट फ़ील्ड के अंत में एक चरित्र था, तो मुझे लॉग संदेश दिया, लेकिन संपादन समाप्त होने पर मुझे इलिप्सिस नहीं मिला।

9

भविष्य के आगंतुकों के लिए, आप -[NSCell expansionFrameWithFrame:inView:] विधि का उपयोग यह निर्धारित करने के लिए कर सकते हैं कि क्या छंटनी हो रही है या नहीं।शीर्षलेख से:

यदि सेलफ्रेम दृश्य में संपूर्ण सामग्री के लिए बहुत छोटा है तो सेल को विस्तार सेल फ्रेम वापस करने की अनुमति देता है। ... < > स्निप करें ... यदि फ्रेम छोटा नहीं है, तो एक खाली आय वापस करें, और कोई विस्तार टूल टिप दृश्य दिखाया जाएगा। डिफ़ॉल्ट रूप से, एनएससीएल NSZeroRect देता है, जबकि कुछ उप-वर्ग (जैसे NSTextFieldCell) आवश्यक होने पर उचित फ्रेम वापस कर देंगे।

संक्षेप में, आप अगर एक NSTextField इस तरह छोटा है बता सकते हैं:

NSRect expansionRect = [[self cell] expansionFrameWithFrame: self.frame inView: self]; 
    BOOL truncating = !NSEqualRects(NSZeroRect, expansionRect); 
+2

यह सबसे अच्छा समाधान है – jimwan

+0

क्या आप एक स्विफ्ट 3 समाधान प्रदान कर सकते हैं? मैं ओबीजे-सी कोड को अनुकूलित करने में सक्षम नहीं था। – ixany

-1

स्विफ्ट 4 समाधान आधार

रूप ipmcc का उपयोग कर यह एक के बाद एक आकार बदलने जब तक यह फिट होगा या fontsize = 3

var size_not_ok = true 

var conter = 0 
let mininum_font_size = 3 // will resize ultil 3 
while size_not_ok || conter < 15 { // will try 15 times maximun 
    let expansionRect = le_nstextfield.expansionFrame(withFrame: le_nstextfield.frame) 

    let truncated = !NSEqualRects(NSRect.zero, expansionRect) 

    if truncated { 

     if let actual_font_size : CGFloat = le_nstextfield.font?.fontDescriptor.object(forKey: NSFontDescriptor.AttributeName.size) as? CGFloat { 

      le_nstextfield.font = NSFont.systemFont(ofSize: actual_font_size - 1) 

      if actual_font_size < mininum_font_size { 
       break 
      } 
     } 
    } else {   
     size_not_ok = false 
    } 
    conter = conter + 1 
}