28

特定の高さのNSTextFieldで、テキストのサイズが小さい場合、レイアウトは次のようになります。

ここに画像の説明を入力してください

テキストが上に流れています。テキストを次のように中央に配置する方法:

ここに画像の説明を入力してください

4

6 に答える 6

8

私は基本的にアレックスの答えを使用していますが、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 のクラスを変更します (これは知りませんでした)。

ここに画像の説明を入力

于 2015-11-18T19:44:44.790 に答える
6

サブクラス化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];
 }
于 2013-09-27T19:30:14.563 に答える