Pertanyaan NSTextField dengan bayangan?


Saya ingin NSTextFields saya mengatur di Interface Builder untuk memiliki bayangan. Saya telah menerapkan cara untuk melakukan ini yang tampaknya berhasil, tetapi saya tidak yakin apakah itu jalan yang benar.

Apa yang saya lakukan adalah subclass NSTextFieldCell sebagai berikut dan kemudian mengatur subclass saya sebagai tipe sel NSTextField di IB. Apakah ada masalah dengan pendekatan ini? Apakah ada cara yang lebih baik?

#import "ShadowTextFieldCell.h"

static NSShadow *kShadow = nil;

@implementation ShadowTextFieldCell

+ (void)initialize
{
    kShadow = [[NSShadow alloc] init];
    [kShadow setShadowColor:[NSColor colorWithCalibratedWhite:0.f alpha:0.08f]];
    [kShadow setShadowBlurRadius:0.f];
    [kShadow setShadowOffset:NSMakeSize(0.f, -2.f)];
}

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
    [kShadow set];
    [super drawInteriorWithFrame:cellFrame inView:controlView];
}

@end

22
2018-04-16 18:55


asal


Jawaban:


Daripada subkelas, Anda bisa menggunakan NSCell's setBackgroundStyle:

[[aTextField cell] setBackgroundStyle:NSBackgroundStyleRaised];

Lihat pertanyaan serupa ini;


10
2017-09-14 07:29



Tidak ada yang salah dengan pendekatan ini. Pilihan lainnya adalah melapisi kembali bidang teks Anda (panggilan [textField setWantsLayer:YES] dan digunakan CALayer'S properti bayangan, tetapi ini sering cara yang tidak diinginkan untuk melakukannya karena rendering teks Core Animation tidak memiliki antialiasing subpiksel.


8
2017-07-15 04:40



Cara termudah adalah

[[yourTextField cell] setBackgroundStyle:NSBackgroundStyleRaised]; 

seperti yang dikatakan zpasternack, tetapi ini hanya digunakan untuk bayangan default, untuk kustom satu subkelas atau menggunakan lapisan ...


1
2018-05-18 16:56