macOS 开发 - NSWindow 自定义样式


荐:自动生成 NSWindow 代码工具-- NSWindow Designer

Mac Apple Store 地址:
https://apps.apple.com/cn/app/nswindow-designer/id1497499563?l=en&mt=12

应用后续还会更新,提供更强大的功能,敬请期待。


零:整体结构

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

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

窗口的组成


一、contentView 相关

1、设置窗口背景颜色

方法1:window.backgroundColor

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

方法2:window.contentView.layer.backgroundColor

    self.window.contentView.layer.backgroundColor = [NSColor cyanColor].CGColor;
    self.window.contentView.wantsLayer = YES;

如果 同时设置上述两种方法,窗口显示为红色,不论设置顺序。

self.window.contentView.layer.backgroundColor = [NSColor redColor].CGColor;
self.window.contentView.wantsLayer = YES;
    
self.window.backgroundColor = [NSColor cyanColor];

2、设置 window frame/尺寸

    [self.window setContentSize:NSMakeSize(infoWindowW, windowHeight)];
  
    
    NSRect wndFrame = self.window.frame;
    [self.window setFrame:NSMakeRect(wndFrame.origin.x, wndFrame.origin.y, infoWindowW, windowHeight) display:YES animate:YES];
    self.window.maxSize = NSMakeSize(infoWindowW, windowHeight);
    self.window.minSize = NSMakeSize(infoWindowW, windowHeight);

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

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

[self.window setMovableByWindowBackground:YES];


二、Content Border

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

Content Border 配置


三、titleBar

1、设置窗口标题

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


2、设置标题栏图标

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

self.window.representedURL = [NSURL URLWithString:@"https://www.baidu.com"];  //
    NSImage *image = [NSImage imageNamed:@"swift"];
    [[self.window standardWindowButton:NSWindowDocumentIconButton] setImage:image];

3、隐藏titlebar

方法1:xib上设置

选中window,取消勾选titleBar。
代码中可以通过 window.hasTitleBar 来了解titleBar是否存在,但是 hasTitleBar 属性为只读,所以不能通过代码设置 hasTitleBar。

这里写图片描述

添加颜色看看效果
连左上角 关闭、放大等选项也消失
这里写图片描述


方法2:代码设置

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

隐藏titlebar

设置window.contentView 的颜色后,显示效果如下:

  • 可以看到关闭、放大选项,titleBar 只是被隐藏,不代表不存在。

隐藏titlebar


4、titleBar和 contentView 融合到一起

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

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

  • 不隐藏titleBar

titleBar和contentView融合


  • 隐藏titleBar

titleBar和contentView融合-隐藏titleBar


5、自定义titleBar

参考 tongwei117:mac 自定义titlebar
https://blog.csdn.net/tongwei117/article/details/71480693


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

核心代码:

 self.window.titlebarAppearsTransparent = YES;
    self.window.titleVisibility = NSWindowTitleHidden;
    [self.window setStyleMask:[self.window styleMask] | NSWindowStyleMaskFullSizeContentView];  


    self.window.contentViewController = [[MSCBViewController alloc]init];

需要在 MSCBViewController 上添加 customView 和 相应的关闭等按钮。


如果不指定 window.contentViewController,而是直接使用 contentView 添加,左上角按钮还会存在。

NSView *msTitleBar = [[NSView alloc]initWithFrame:NSMakeRect(0, titleBarY, self.window.frame.size.width, titleBarH)];
    
msTitleBar.wantsLayer = YES; //需要先设置这个,再设置颜色,否则颜色无效
    msTitleBar.layer.backgroundColor = [NSColor redColor].CGColor;
[self.window.contentView addSubview:msTitleBar];

6、隐藏关闭隐藏等按钮

[[self.window standardWindowButton:NSWindowCloseButton] setEnabled:NO];

其他可能被隐藏的标准按钮包括:

 enum {
    NSWindowCloseButton,
    NSWindowMiniaturizeButton,
    NSWindowZoomButton,
    NSWindowToolbarButton,
    NSWindowDocumentIconButton
 };

四、常用属性、系统样式

常用的创建代码:

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

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: macOS是苹果公司开发的一款操作系统,而Arm-Linux是一款基于Arm架构的Linux操作系统。MacOS Arm-Linux指的是在Mac电脑上运行基于Arm架构的Linux系统。 苹果公司宣布将在不久的将来改变Mac电脑的芯片架构,从之前使用的Intel处理器转变为自家研发的Arm架构处理器。这意味着未来的Mac电脑将可以运行使用Arm架构编译的软件。 在这种背景下,Mac电脑将具备运行Arm-Linux操作系统的能力。Arm-Linux是Linux操作系统的一个分支,被广泛应用于嵌入式设备和移动设备等领域。将Arm-Linux移植到Mac电脑上,用户可以通过在Mac上运行Linux,获得更多的软件和应用选择。 MacOS Arm-Linux的引入将为用户提供更多的自由和灵活性。Arm-Linux操作系统具有良好的兼容性和可定制性,用户可以根据个人需求进行自定义设置,进行系统优化和调试等操作。同时,对于开发者来说,Arm-Linux也提供了更多的开发工具和环境,使他们能够更方便地进行软件开发和调试。 总之,MacOS Arm-Linux的结合将为用户带来更广阔的选择和更多的可能性,使Mac电脑成为一款更加强大和多功能的设备。用户可以享受到更多的软件和应用,同时也能更灵活地进行系统设置和软件开发等操作。这对于个人和开发者来说都是一种积极的变化,有助于提升用户体验和系统的可定制性。 ### 回答2: macOS是苹果公司自主开发的操作系统,主要运行于苹果的个人电脑和服务器上。而arm-linux是一种基于ARM架构的Linux操作系统。 macOS使用的是x86架构,而arm-linux则是基于ARM架构的操作系统。这两种架构在硬件和指令集上存在差异,因此软件在不同架构上运行时需要进行编译和适配。 最近,苹果公司宣布将在将来的Mac电脑上使用自家研发的ARM架构芯片。这一决定的背后有很多原因,其中包括更好的性能、能效和统一化等。换句话说,未来的Mac电脑将会运行基于ARM架构的芯片,并适配macOS操作系统。 对于软件开发者和用户来说,这个转变意味着一些软件可能需要重新编写或适配以在新的硬件和操作系统上运行。macOS上原本运行良好的x86架构软件需要重新编译为ARM架构版本,以确保兼容性和性能。 然而,这个转变也给开发者带来了新的机会。ARM架构在移动设备上已经得到广泛应用,移植到Mac电脑上有望带来更好的性能和能效。此外,将来的Mac电脑和iOS设备将共享更多的软件和生态系统,有助于提升跨设备的一体化体验。 总之,macOS将转向ARM架构的决定对于苹果公司和用户来说都是一个重要的里程碑。它将带来更好的性能、能效和统一化,并为开发者带来新的机遇。也许,未来的Mac电脑将更加强大和多样化。 ### 回答3: macOS是苹果公司的操作系统,它最初是基于PowerPC架构的,后来转向了x86架构。而ARM架构是一种使用更低功耗的处理器架构,被广泛应用于手机、平板电脑和嵌入式系统等领域。 近年来,ARM架构的处理器性能不断提升,开始逐渐应用于个人电脑领域。所以有人开始猜测苹果是否会将ARM架构引入其Mac电脑产品线。 然而,直到2020年底,苹果才正式发布了基于ARM架构的Mac电脑。这代表着苹果公司将逐渐适应ARM架构,并且未来的Mac电脑将会更加高效、节能。 对于开发者和用户来说,macOS转向ARM架构意味着一些程序和应用可能需要重新编译和优化,以适应新架构的要求。同时,用户也将享受到更长续航时间、更流畅的系统操作和更低的功耗。 对于整个行业来说,macOS转向ARM架构也体现了ARM架构的不断演进和扩大应用领域。它有望推动ARM架构在电脑领域的发展,进一步加强ARM与x86架构的竞争。特别是在移动办公、云计算和物联网等领域,ARM架构有望发挥更大的优势。 总之,macOS转向ARM架构是苹果公司顺应时代发展趋势的举措。它将为用户带来更好的系统体验,也为整个行业的发展带来新的机遇和挑战。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伊织Scope

请我喝杯伯爵奶茶~!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值