关闭

MacOS 开发 - NSWindow 自定义样式

标签: NSWindowMacOS开发StyleMask点击背景可以移动窗口隐藏titlebar
2975人阅读 评论(1) 收藏 举报
分类:


窗口对象包括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

0
0
查看评论

NSWindow知多少?

如果你有其他的平台的經驗,來寫 Cocoa 應用程式,可能會發現 NSWindow 的行為跟你想得似乎不太一樣。 ※ NSWindow 屬於 View 雖然現在的 GUI 應用程式的架構大都遵循 MVC 的設計典範,但是不同的 Framework 之間,那個部分屬於 View,那個部分又屬於...
  • xxq_2011
  • xxq_2011
  • 2012-12-09 21:34
  • 3341

MacOS 开发 - NSWindow 的创建和跳转

创建 Window 和 WindowController 跳转 返回经典用法 使用 xib 来创建 NSWindowController,并让后续的调用都继承自这个类。1、创建项目时,不勾选 Use Storyboards 选项; 创建出来的项目就包含 MainMenu.xib创建 Window...
  • lovechris00
  • lovechris00
  • 2017-09-10 15:26
  • 2870

NSWindow 了解

Style Masks:指定窗口的标题栏和里面按钮的控制 1、NSBorderLessWindowMask  没有外部元件 比如关闭按钮,全屏,toolbar等 2、NSTitledWindowMask  是否有布置一个ti...
  • leer168
  • leer168
  • 2013-10-25 15:19
  • 7107

mac app开发之:利用NSWindowController实现窗口跳转

今天这篇博客主要讲述的是窗口之间的跳转,当然了相对于ios 页面之间跳转,还是觉得ios更可爱许多!一般在ios开发中我们都习惯于继承于系统的UIViewController自定义一个BaseViewController(名字是大家随便取的,根据个人爱好,请不要在意!),更方便于自己把公有的属性写在...
  • u012890071
  • u012890071
  • 2016-03-07 10:29
  • 7064

自定义NSWindow,Round Corner,Non-TitleBar

参考: NSWindow with round corners and shadow Round corners on a borderless NSWindow NSTextField not editable in custom NSWindow Hide NSWindow title ...
  • ljz2012008
  • ljz2012008
  • 2015-07-04 17:24
  • 1466

Mac OS使用技巧之七:个性化自己的Mac OS主界面

Mac OS的亮点之一就在于它精炼美观的主界面。Mac OS的界面跟我们熟悉的windows是截然不同的,赋予了桌面新的定义,能够完美的体现一张牛X的壁纸,是有多么的吸引人。
  • u012200908
  • u012200908
  • 2014-09-10 11:47
  • 21987

Cocoa 让自定义view铺满整个NSWindow

title: 让自定义view铺满整个NSWindow我们通过IB拖到窗体中的控件都是放到NSWindow的contentView视图中的,但是这个contentView不是铺满整个window的,顶部会有一个系统风格的titlebarView,现在项目需要让自定义的view可以铺满整个window...
  • shalyf
  • shalyf
  • 2015-12-09 15:58
  • 1822

NSWindowDelegate 关于窗口大小 位置 显示 等api说明

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSWindowDelegate_Protocol/#//apple_ref/occ/intfm/NSWindowDelegate/windowDidBecom...
  • zdpyly21
  • zdpyly21
  • 2016-04-18 14:33
  • 1721

NSWindow的样式

转自:http://www.cocoachina.com/bbs/read.php?tid=202710 [_window setMovableByWindowBackground:YES]; //可以拖动 //self.window.styleMask=NSTe...
  • Jason_chen13
  • Jason_chen13
  • 2016-01-05 10:21
  • 1014

mac 自定义titlebar

mac 自定义titlebar,背景为图片,并且图片拉伸做了保护区域 首先随便在storyboard中拖到viewController中一个contentview。然后创建一个继承自NSView的CustomView,修改刚拖进去控件测class为CustomView。 然后把刚才拖的控件往...
  • tongwei117
  • tongwei117
  • 2017-05-09 16:55
  • 501
    博客专栏
    个人资料
    • 访问:210171次
    • 积分:3453
    • 等级:
    • 排名:第11457名
    • 原创:127篇
    • 转载:6篇
    • 译文:1篇
    • 评论:96条
    最新评论