特定の高さのNSTextFieldで、テキストのサイズが小さい場合、レイアウトは次のようになります。
テキストが上に流れています。テキストを次のように中央に配置する方法:
特定の高さのNSTextFieldで、テキストのサイズが小さい場合、レイアウトは次のようになります。
テキストが上に流れています。テキストを次のように中央に配置する方法:
私は基本的にアレックスの答えを使用していますが、1 つの修正があります。y 原点を増やす場合は、titleRect の高さを減らす必要があります。そうしないと、titleRect がそのスーパービューの下で終了し、NSTextField の下にコンテンツが隠される可能性があります。
.h:
#import <Cocoa/Cocoa.h>
@interface VerticallyCenteredTextFieldCell : NSTextFieldCell
@end
彼ら:
#import "VerticallyCenteredTextFieldCell.h"
@implementation VerticallyCenteredTextFieldCell
- (NSRect) titleRectForBounds:(NSRect)frame {
CGFloat stringHeight = self.attributedStringValue.size.height;
NSRect titleRect = [super titleRectForBounds:frame];
CGFloat oldOriginY = frame.origin.y;
titleRect.origin.y = frame.origin.y + (frame.size.height - stringHeight) / 2.0;
titleRect.size.height = titleRect.size.height - (titleRect.origin.y - oldOriginY);
return titleRect;
}
- (void) drawInteriorWithFrame:(NSRect)cFrame inView:(NSView*)cView {
[super drawInteriorWithFrame:[self titleRectForBounds:cFrame] inView:cView];
}
@end
また、VerticallyCenteredTextFieldCell は NSTextFieldCell のサブクラスです。サブクラス化する場合は、Interface Builder で NSTextField ではなく NSTextFieldCell のクラスを変更します (これは知りませんでした)。
サブクラス化NSTextFieldCell
(またはスウィズル)するだけで...そして実装...
- (NSRect) titleRectForBounds:(NSRect)frame {
CGFloat stringHeight = self.attributedStringValue.size.height;
NSRect titleRect = [super titleRectForBounds:frame];
titleRect.origin.y = frame.origin.y +
(frame.size.height - stringHeight) / 2.0;
return titleRect;
}
- (void) drawInteriorWithFrame:(NSRect)cFrame inView:(NSView*)cView {
[super drawInteriorWithFrame:[self titleRectForBounds:cFrame] inView:cView];
}