老谭笔记

自定义NSSearchFiled样式

在Mac OSX的软件中经常会使用到NSSearchFiled这个控件,用它来做搜索框还是非常方便的,之前使用它时都是采用的默认造型,但最近的一个项目因为整体风格的原因,它的外观显然不满足使用,最初本打算自己去实现一个类似的NSSearchField,但发现要实现功能和NSSearchField一样的控件,需要的代码量还不少,于是最终还是选择了去派生一个风格不一样的NSSearchFieldCell,简单几行代码便可实现修改背景色、光标颜色、放大镜图标和退出图标,恰好这两天有人写邮件问我如何修改NSSearchField的样式,我就随便贴出这几行代码,其实非常简单:

THSearchField

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#import "THSearchFieldCell.h"
@implementation THSearchFieldCell
//通过代码实例化
- (id)init
{
self = [super init];
if (self)
{
[self setUp];
}
return self;
}
//通过xib实例化
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self)
{
[self setUp];
}
return self;
}
- (void)setUp
{
//重写搜索图标
NSButtonCell *searchButtonCell = [self searchButtonCell];
NSImage *searchImage = [NSImage imageNamed:NSImageNameHomeTemplate];
[searchImage setSize:NSMakeSize(16, 16)];
[searchButtonCell setImage:searchImage];
[searchButtonCell setAlternateImage:searchImage];
//重写取消图标
NSButtonCell *cancelButtonCell = [self cancelButtonCell];
NSImage *cancelImage = [NSImage imageNamed:NSImageNameRevealFreestandingTemplate];
[cancelImage setSize:NSMakeSize(16, 16)];
[cancelButtonCell setImage:cancelImage];
[cancelButtonCell setAlternateImage:cancelImage];
}
//重写该方法实现对背景色的修改
- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
NSRect rect = controlView.bounds;
NSBezierPath *bezierPath = [NSBezierPath bezierPathWithRoundedRect:rect
xRadius:NSHeight(rect)/2
yRadius:NSHeight(rect)/2];
[[NSColor orangeColor] set];
[bezierPath fill];
[super drawInteriorWithFrame:cellFrame inView:controlView];
}
//重写该方法实现对光标颜色的修改
- (NSText *)setUpFieldEditorAttributes:(NSText *)textObj
{
NSText *text = [super setUpFieldEditorAttributes:textObj];
[(NSTextView*)text setInsertionPointColor:[NSColor whiteColor]];
return text;
}
@end

完整的测试代码下载:THSearchFieldDemo.zip