2009-11-18 14 views
9

मेरे पास एक NSTextFieldCell है जिसे मैं मध्यम लंबवत संरेखण के साथ प्रदर्शित करना चाहता हूं। यहां एक पुराने प्रश्न और ब्लॉग एंट्री के लिए धन्यवाद, मेरे पास दो कामकाजी समाधान हैं।NSTextFieldCell लंबवत संरेखण, समाधान क्षैतिज संरेखण को स्क्वैश करने लगते हैं

हालांकि, दोनों समाधान सेल को सही गठबंधन के रूप में सेट करने की मेरी क्षमता को स्क्वैश करने लगते हैं। क्या कोई मुझे इन समाधानों में से किसी एक को संरेखण के दोनों रूपों का समर्थन करने में मदद कर सकता है?

@implementation MiddleAlignedTextFieldCell 

- (NSRect)titleRectForBounds:(NSRect)theRect { 
    NSRect titleFrame = [super titleRectForBounds:theRect]; 
    NSSize titleSize = [[self attributedStringValue] size]; 
    titleFrame.origin.y = theRect.origin.y - .5 + (theRect.size.height - titleSize.height)/2.0; 
    return titleFrame; 
} 

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView { 
    NSRect titleRect = [self titleRectForBounds:cellFrame]; 
    [[self attributedStringValue] drawInRect:titleRect]; 
} 

@end 

वैकल्पिक समाधान (this blog से प्राप्त) है::

@implementation RSVerticallyCenteredTextFieldCell 

- (NSRect)drawingRectForBounds:(NSRect)theRect 
{ 
    NSRect newRect = [super drawingRectForBounds:theRect]; 

    if (mIsEditingOrSelecting == NO) 
    { 
     // Get our ideal size for current text 
     NSSize textSize = [self cellSizeForBounds:theRect]; 

     // Center that in the proposed rect 
     float heightDelta = newRect.size.height - textSize.height; 
     if (heightDelta > 0) 
     { 
      newRect.size.height -= heightDelta; 
      newRect.origin.y += (heightDelta/2); 
     } 
    } 

    return newRect; 
} 

- (void)selectWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject start:(int)selStart length:(int)selLength 
{ 
    aRect = [self drawingRectForBounds:aRect]; 
    mIsEditingOrSelecting = YES;  
    [super selectWithFrame:aRect inView:controlView editor:textObj delegate:anObject start:selStart length:selLength]; 
    mIsEditingOrSelecting = NO; 
} 

- (void)editWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject event:(NSEvent *)theEvent 
{ 
    aRect = [self drawingRectForBounds:aRect]; 
    mIsEditingOrSelecting = YES; 
    [super editWithFrame:aRect inView:controlView editor:textObj delegate:anObject event:theEvent]; 
    mIsEditingOrSelecting = NO; 
} 

@end 

उत्तर

5

मैं इस सवाल को प्रश्न के बाद पोस्ट कर रहा हूं क्योंकि यह काम करता है, हालांकि, मुझे यह तथ्य मिल गया है कि मुझे आईबी से संरेखण सेटिंग की जांच करने का कोई और तरीका नहीं मिला है, यह बहुत परेशान है। _cFlags तक पहुंचने से थोड़ा गंदा लगता है, और मुझे क्लीनर विधि ढूंढना अच्छा लगेगा।

this blog entry से पहले पोस्ट किए गए कोड के आधार पर।

- (NSRect)drawingRectForBounds:(NSRect)theRect 
{ 
    // Get the parent's idea of where we should draw 
    NSRect newRect = [super drawingRectForBounds:theRect]; 

    if (mIsEditingOrSelecting == NO) 
    { 
     // Get our ideal size for current text 
     NSSize textSize = [self cellSizeForBounds:theRect]; 

     // Center that in the proposed rect 
     float heightDelta = newRect.size.height - textSize.height; 
     if (heightDelta > 0) 
     { 
      newRect.size.height -= heightDelta; 
      newRect.origin.y += (heightDelta/2); 
     } 

     // For some reason right aligned text doesn't work. This section makes it work if set in IB. 
     // HACK: using _cFlags isn't a great idea, but I couldn't find another way to find the alignment. 
     // TODO: replace _cFlags usage if a better solution is found. 
     float widthDelta = newRect.size.width - textSize.width; 
     if (_cFlags.alignment == NSRightTextAlignment && widthDelta > 0) { 
      newRect.size.width -= widthDelta; 
      newRect.origin.x += widthDelta; 
     } 

    } 

    return newRect; 
} 
3

आप NSParagraphStyle/NSMutableParagraphStyle उपयोग कर सकते हैं संरेखण निर्धारित करने के लिए (और अन्य विशेषताओं

यहाँ एक समाधान के लिए कोड है)। अपनी जिम्मेदार स्ट्रिंग की पूरी श्रृंखला में एक उचित रूप से कॉन्फ़िगर किया गया NSParagraphStyle ऑब्जेक्ट जोड़ें।

+0

मुझे प्रस्तुति के उस हिस्से में मेरी डेटा परत के साथ जोड़े की आवश्यकता है, और ईमानदारी से मुझे यकीन नहीं है कि मुझे यह पसंद है। इसे आईबी में प्रस्तुत विकल्पों का सम्मान करना चाहिए, लेकिन कुछ कारणों से यह नहीं है (उस मामले के लिए लंबवत संरेखण भी आईबी में एक विकल्प होना चाहिए)। –

+0

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

+0

एर, यह "वृद्धि अनुरोध" है। लिंक: http://bugreporter.apple.com –

2

similar question में पोस्ट किए गए कुछ संभावित समाधान हैं जिन्हें मैंने कुछ समय पहले पूछा था।

सब ईमानदारी में, मैं अभी भी गैर-दस्तावेजी _cFlags.vCentered बूलियन का उपयोग करें (tsktsk, बुरा प्रोग्रामर!) काम करवाने के लिए। यह आसान है, और यह काम करता है। अगर मुझे करना है तो मैं बाद में पहिया को फिर से शुरू करूंगा।

अद्यतन:

ठीक है, मुझे लगता है कि मैं इसे खोज निकाला है। डिफ़ॉल्ट समाधान प्राप्त करने के लिए दोनों समाधान super पर कॉल पर भरोसा करते हैं, और उसके बाद लंबवत केंद्रिंग करने के लिए origin.y और size.height संशोधित करें। super पर कॉल, हालांकि, एक आयताकार लौटाएं जिनकी चौड़ाई क्षैतिज रूप से पाठ को फिट करने के लिए पहले ही समायोजित की जा चुकी है।

# 1 समाधान में:

- (NSRect)titleRectForBounds:(NSRect)theRect { 
    NSRect titleFrame = [super titleRectForBounds:theRect]; 
    NSSize titleSize = [[self attributedStringValue] size]; 

    // modified: 
    theRect.origin.y += (theRect.size.height - titleSize.height)/2.0 - 0.5; 
    return theRect; 
} 

# 2 समाधान में

समाधान origin.x और size.width सीमा से उपयोग करने के लिए रेक्ट कि विधि में पारित हो जाता है है :

- (NSRect)drawingRectForBounds:(NSRect)theRect 
{ 
    NSRect newRect = [super drawingRectForBounds:theRect]; 

    // modified: 
    newRect.origin.x = theRect.origin.x; 
    newRect.size.width = theRect.size.width; 

    if (mIsEditingOrSelecting == NO) 
    { 
     // Get our ideal size for current text 
     NSSize textSize = [self cellSizeForBounds:theRect]; 

     // Center that in the proposed rect 
     float heightDelta = newRect.size.height - textSize.height; 
     if (heightDelta > 0) 
     { 
      newRect.size.height -= heightDelta; 
      newRect.origin.y += (heightDelta/2); 
     } 
    } 

    return newRect; 
} 
+0

यह वास्तव में उस प्रश्न का समाधान था कि मुझे अपने समाधानों में से एक मिला। –

+0

मैं इस समाधान के साथ क्षैतिज संरेखण को बनाए रखने का तरीका जानने का प्रयास कर रहा हूं। लेकिन मुझे नीचे जाना होगा और अगर मैं नहीं कर सकता तो दूसरा रास्ता आज़माएं। –

+0

मुझे आश्चर्य है कि क्षैतिज संरेखण इन समाधानों में से किसी एक से प्रभावित होता है, क्योंकि उनमें से कोई भी x आयाम से गड़बड़ नहीं करता है। आप संरेखण कैसे सेट कर रहे हैं? कॉलम और सेल दोनों पर इंटरफेस बिल्डर में –

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