Cocoa学习

我的Cocoa/Cocoa Touch学习笔记

在NSWindow窗口标题栏上绘制辅助视图

如果你用过Acorn的试用版,你一定知道Acorn的试用版的文档窗口的标题栏上有一个提示过期的按钮。虽然标题栏不能被滥用来绘制控件,但是有时候,恰到好处的使用会改善用户体验。比如说,Lion的全屏按钮就是放在标题栏上的;Chocolat文本编辑器也放了一个新建标签的按钮在标题栏上,Lion全屏按钮的旁边。

初看起来,在标题栏上加一个辅助视图似乎很有难度;不过事实上,早就已经有人把方法贴在Blog里了(注意,原文里的UIController不是UIKit的类,该文发布的时候UIKit和iPhone还没有发布呢,因此这算是个NameSpace冲突吧,其实文中的UIController就是个普通的Cocoa Controller类而已)。本文算是半转载地复制代码过来,供大家参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- (void)awakeFromNib {
    [self composeInterface];
}

- (void)composeInterface {
    NSView *themeFrame = [[self.window contentView] superview];

    NSRect themeFrameRect = [themeFrame frame];
    NSRect accessoryViewFrame = [self.accessoryView frame];
    NSRect newFrame = NSMakeRect(themeFrameRect.size.width - accessoryViewFrame.size.width,
                                 themeFrameRect.size.height - accessoryViewFrame.size.height,
                                 accessoryViewFrame.size.width,
                                 accessoryViewFrame.size.height);
    [self.accessoryView setFrame:newFrame];

    [themeFrame addSubview:self.accessoryView];
}

我做了一个示例项目,放到了本blog的github里。下面简述一下过程:在WindowController(为了示例的简便起见,我直接放在AppDelegate里了)里新建上述-composeInterface:方法,然后在-awakeFromNib:里调用这个方法。这个方法的原理非常简单,就是获取windowcontentView的上一级View,然后把accessoryView定位到该View的右上角。这样我们就能够在accessoryView里绘制控件了。不过需要注意的是,窗口标题栏高度有限,因此accessoryView的高度不能超过22pt,并且,也不要太宽。不过放一个小按钮还是绰绰有余了。另外,如果有Lion的全屏按钮支持的话,需要在accessoryView的右侧留出全屏按钮的空间;或者在composeInterface方法中,设置accessoryViewFrame的时候,留出全屏按钮的空间。下面就是这个我做的示例项目的运行效果:

看着是不是还是挺有范儿的? :D 如果你有什么不清楚的地方,可以看一下示例程序的源码,对于新建项目,添加控件,设置视图等这些常规的操作我就不赘述了。

(全文完)

Comments