SORU
5 AĞUSTOS 2009, ÇARŞAMBA


Bir "sağ" NSTextFieldCell dikey çizmek için yolu ortalanmış metin var mı?

Birkaç METİN sütun NSTableView var. Varsayılan olarak, dataCell bu sütunlar örneği Apple'ın NSTextFieldCell sınıf, her türlü güzel şeyler, ama çizer metin hizalanmış üst hücre ve istediğim metin için dikey olarak ortalanmış bir hücredir.

Dikey metin merkezi için kullanılan NSTextFieldCell dahili bir bayrak var ve güzel çalışıyor. Dahili bir bayrak olduğundan, ancak, onun kullanın Apple tarafından onaylanmış değildir ve sadece gelecekteki bir sürümde uyarı olmadan kaybolabilir. Şu anda basit ve etkili olduğu için bu iç bayrak kullanıyorum. Apple belli ki biraz zaman özelliği uygulamaya geçirdi, yeniden uygulamaya bu fikri sevmiyorum.

Yani; benim sorum şu:Tam olarak Apple'ın NStextFieldCell gibi davranır, ama üst hizalı yerine dikey olarak ortalanmış metin çeken bir şey uygulamak için doğru yolu nedir?

Bu arada, işte benim geçerli "": . çözüm

@interface NSTextFieldCell (MyCategories)
- (void)setVerticalCentering:(BOOL)centerVertical;
@end

@implementation NSTextFieldCell (MyCategories)
- (void)setVerticalCentering:(BOOL)centerVertical
{
    @try { _cFlags.vCentered = centerVertical ? 1 : 0; }
    @catch(...) { NSLog(@"*** unable to set vertical centering"); }
}
@end

Aşağıdaki gibi kullanılır

[[myTableColumn dataCell] setVerticalCentering:YES];

CEVAP
3 Mart 2012, CUMARTESİ


Diğer cevapları birden fazla satır için işe yaramadı. Bu nedenle ben başlangıçta cFlags.vCentered belgelenmemiş bir özelliği kullanmaya devam etti, ama benim app Store'dan reddedilmesine neden oldu. Birden fazla satır, sözcük kaydırma ve kesilmiş son bir satır için çalışan Matt Bell çözüm değiştirilmiş bir sürümü ile sona erdi:

-(void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {
    NSAttributedString *attrString = self.attributedStringValue;

    /* if your values can be attributed strings, make them white when selected */
    if (self.isHighlighted && self.backgroundStyle==NSBackgroundStyleDark) {
        NSMutableAttributedString *whiteString = attrString.mutableCopy;
        [whiteString addAttribute: NSForegroundColorAttributeName
                            value: [NSColor whiteColor]
                            range: NSMakeRange(0, whiteString.length) ];
        attrString = whiteString;
    }

    [attrString drawWithRect: [self titleRectForBounds:cellFrame] 
                     options: NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin];
}

- (NSRect)titleRectForBounds:(NSRect)theRect {
    /* get the standard text content rectangle */
    NSRect titleFrame = [super titleRectForBounds:theRect];

    /* find out how big the rendered text will be */
    NSAttributedString *attrString = self.attributedStringValue;
    NSRect textRect = [attrString boundingRectWithSize: titleFrame.size
                                               options: NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin ];

    /* If the height of the rendered text is less then the available height,
     * we modify the titleRect to center the text vertically */
    if (textRect.size.height < titleFrame.size.height) {
        titleFrame.origin.y = theRect.origin.y   (theRect.size.height - textRect.size.height) / 2.0;
        titleFrame.size.height = textRect.size.height;
    }
    return titleFrame;
}

(Bu kodu ARC varsayar; Ekle attrString sonra bir autorelease.eğer manuel bellek yönetimi kullanırsanız mutableCopy)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 3dmmfavs

    3dmmfavs

    29 Kasım 2009
  • After Effects Tutorials w/ Mikey

    After Effect

    24 HAZİRAN 2009
  • GenTechPC

    GenTechPC

    1 Temmuz 2007