MacOS 开发 - NSWindow 自定义样式

原创 2017年09月12日 12:39:32


窗口对象包括titleBar,contentView内容视图,contentBoder底部边框区。

titleBar上面包括控制按钮,标题。

窗口的组成


设置标题

[self.window setTitle:@"我的 App 标题"];


设置标题栏图标

先将 png 格式图片拖到Assets 中,我的图片名为’swift.png’
配置代码如下:


    NSImage *image = [NSImage imageNamed:@"swift"];
    [[self.window standardWindowButton:NSWindowDocumentIconButton] setImage:image];

设置窗口背景颜色

- (void)setWindowBKColor {
    [self.window setOpaque:NO];
    [self.window setBackgroundColor:[NSColor cyanColor]];
}

设置 Content Border

默认是none 不显示出来.
需要显示的话可以选择 Small/Large Bottom Border 其他选项
这里我还不知道怎么用代码控制,会的可以告诉我。

Content Border 配置


自定义titleBar

原理:隐藏系统自带的titlebar, 继承NSView自己绘制一个titlebar, 在其上添加相应的关闭,最小化,最大化按钮,可以自定义调节颜色,隐藏,显示,高度,以及添加相应的其它控件。


隐藏titlebar

self.window.titlebarAppearsTransparent=YES;
self.window.titleVisibility = NSWindowTitleHidden;

隐藏titlebar

  • 但设置window.contentView 的颜色后,显示效果如下:
    隐藏titlebar

设置为点击背景可以移动窗口

  • 如果隐藏了标题栏,点击标题栏位置,仍然可以拖动窗口。但是用户不知道标题栏的位置,所以需要设置点击背景也可以移动。

[self.window setMovableByWindowBackground:YES];


titleBar和下面的view合并到一起

xib:在Main.storyboard选中Window,勾选属性Full Size Content View

代码:
self.window.styleMask = self.window.styleMask | NSWindowStyleMaskFullSizeContentView;

  • 不隐藏titleBar

titleBar和contentView融合

  • 隐藏titleBar

titleBar和contentView融合-隐藏titleBar


系统提供的样式

常用的创建代码:

NSRect frame = CGRectMake(0, 0, 200, 200);
NSUInteger style =  NSTitledWindowMask | NSClosableWindowMask |NSMiniaturizableWindowMask | NSResizableWindowMask;
NSWindow *window = [NSWindow alloc]initWithContentRect:frame styleMask:style backing:NSBackingStoreBuffered defer:YES];
window.title = @"New Create Window";
[window makeKeyAndOrderFront:self];

1、styleMask: 按位表示的窗口风格参数

enum {
   NSBorderlessWindowMask = 0, //没有顶部titilebar边框
   NSTitledWindowMask = 1 << 0, //有顶部titilebar边框
   NSClosableWindowMask = 1 << 1,//带有关闭按钮
   NSMiniaturizableWindowMask = 1 << 2,//带有最小化按钮
   NSResizableWindowMask = 1 << 3,//恢复按钮
   NSTexturedBackgroundWindowMask = 1 << 8 //带纹理背景的window
};

2、backing:窗口绘制的缓存模式

enum {
   NSBackingStoreRetained       = 0,// 兼容老系统参数,基本很少用到
   NSBackingStoreNonretained  = 1,//不缓存直接绘制
   NSBackingStoreBuffered        = 2//缓存绘制
};

3、defer:表示延迟创建还是立即创建

4、NSWindowStyleMask

typedef NS_OPTIONS(NSUInteger, NSWindowStyleMask) {
    NSWindowStyleMaskBorderless = 0,
    NSWindowStyleMaskTitled = 1 << 0,//显示标题
    NSWindowStyleMaskClosable = 1 << 1,//可关闭,如果不加,则关闭按钮处显示一个灰色按钮,不可点击
    NSWindowStyleMaskMiniaturizable = 1 << 2, //可最小化
    NSWindowStyleMaskResizable  = 1 << 3,//可调整尺寸,即拉伸

    NSWindowStyleMaskTexturedBackground = 1 << 8,//北京味文字,标题栏没有边框线。如果需要线,要使用 NSUnifiedTitleAndToolbarWindowMask

    NSWindowStyleMaskUnifiedTitleAndToolbar = 1 << 12, //标题栏和toolBar 下有统一的分割线

    NSWindowStyleMaskFullScreen NS_ENUM_AVAILABLE_MAC(10_7) = 1 << 14,//全屏显示

    NSWindowStyleMaskFullSizeContentView NS_ENUM_AVAILABLE_MAC(10_10) = 1 << 15,//contentView会充满整个窗口。

    /* 下面样式只适用于NSPanel及其子类 */
    NSWindowStyleMaskUtilityWindow          = 1 << 4,
    NSWindowStyleMaskDocModalWindow         = 1 << 6,
    NSWindowStyleMaskNonactivatingPanel     = 1 << 7, 
    NSWindowStyleMaskHUDWindow NS_ENUM_AVAILABLE_MAC(10_6) = 1 << 13 //用于头部显示的panel 
};

优秀作品:


参考资料:
剑指人心: http://www.macdev.io/ebook/window.html

版权声明:本文为博主原创文章,转载请附上本文链接地址。

相关文章推荐

NSWindow的样式

转自:http://www.cocoachina.com/bbs/read.php?tid=202710 [_window setMovableByWindowBackground:YES...

Cocoa 让自定义view铺满整个NSWindow

title: 让自定义view铺满整个NSWindow我们通过IB拖到窗体中的控件都是放到NSWindow的contentView视图中的,但是这个contentView不是铺满整个window的,顶...
  • shalyf
  • shalyf
  • 2015年12月09日 15:58
  • 1632

macOS开发中NSWindow, NSWindowController, NSView, NSViewController的关系

macOS使用的Cocoa框架,的确没有iOS使用的Cocoa Touch那么智能好用。有些地方逻辑很奇怪,还有一些看似很正常的功能它却没有提供,还需要自定义。这里就有一个很头疼的问题,关于这四个类的...

自定义NSWindow,Round Corner,Non-TitleBar

参考: NSWindow with round corners and shadow Round corners on a borderless NSWindow NSTextField not...

自定义NSTitlebar之NSTitlebarAccessoryViewController

在10.10 之后的版本会简单一下,   第一步, 给窗口添加Toolbar, 但删掉Toolbar中的所有内容, 取消Customizable(相当于禁用Toolbar自定义功能)    ...

MacOS 开发 - isFlipped(坐标系)

左、右手坐标系在Mac中CALayer使用的是右手坐标系,其原点在左下角; iOS中使用的左手坐标系,其原点在左上角。isFlipped你要是不习惯cocoa 的话可以强制性修改它的坐标系,如:通过...

NSWindow 了解

Style Masks:指定窗口的标题栏和里面按钮的控制 1、NSBorderLessWindowMask  没有外部元件 比如关闭按钮,全屏,toolbar等 2、NSTitledW...
  • leer168
  • leer168
  • 2013年10月25日 15:19
  • 6904

NSWindow的样式

转自:http://www.cocoachina.com/bbs/read.php?tid=202710 [_window setMovableByWindowBackground:YES...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MacOS 开发 - NSWindow 自定义样式
举报原因:
原因补充:

(最多只允许输入30个字)