窗口NSWindow

文章介绍了NSWindow在MacOS应用开发中的关键概念,包括keyWindow和mainWindow的区别,模态窗口的两种类型及其创建方法,窗口对象的创建过程,以及窗口显示控制、通知和内容视图的设置。此外,还讨论了如何设置窗口属性如标题、背景色和阴影效果。
摘要由CSDN通过智能技术生成

窗口NSWindow

一.keyWindow和mainWindow

可以接收输入事件(键盘,鼠标,触控板等外设)的窗口对象称为keyWindow;当前的活动窗口也称为mainWindow。一个时刻只能有一个keyWindow和一个mainWindow。keyWindow和mainWindow可以是同一个窗口,也可以是不同的窗口。当mainWindow可以接收输入事件时,它同时也是keyWindow。
NSPanel类型的window不能做为mainWindow,只能做为keyWindow。一些常用的子类有NSColorPanel(颜色选择),NSFontPanel(字体选择),NSSavePanel(保存打开文件)

二.模态窗口

当有多个window在屏幕上时,用户可以点击切换到任何一个窗口上。有些特殊场景需要限制用户只能处理完当前的窗口的任务,只有关闭或处理完这个窗口才能继续操作其它的window。因此引入了模态窗口的概念。

有2种创建模态窗口的方法:

1.Modal windows
这种window比较霸道,当它启动后,此时只有这个window可以接收响应用户操作,无法切换到其他窗口操作,其他窗口也不能接收处理系统内部的各种事件。

使用NSApplication的runModalForWindow方法来创建Modal window

- (IBAction)showModelWindowAction:(id)sender {
    [[NSApplication sharedApplication]runModalForWindow:self.myWindow];
}

使用stopModal方法来结束模态。

[NSApplication sharedApplication]stopModal];

2.Modal sessions
比起Modal windows,Modal sessions方式创建的window稍微温和一些,允许响应快捷键和系统菜单,比如字体颜色选择这些panel面板.

启动Modal sessions 窗口

NSModalSession sessionCode = [[NSApplication sharedApplication]beginModalSessionForWindow:window];
结束Modal sessions 窗口

使用sessionCode做为参数来关闭Modal sessions 窗口

[[NSApplication sharedApplication]endModalSession:sessionCode];

注意任何一种模态窗口,都必须调用结束模态的方法去结束模态。如果点击了window左上角的关闭按钮,而没有执行结束模态的方法。整个系统仍然处于模态,其他窗口无法正常工作。

三.创建窗口对象

使用NSWindow类创建窗口对象,除了frame参数,还需要制定styleMask来确定窗口样式风格。

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:表示延迟创建还是立即创建

四.窗口显示控制

1.窗口居屏幕中心显示

-(void)center;

2.前置显示窗口并且是其成为keyWindow

-(void)makeKeyAndOrderFront:(id)sender;

3.前置显示窗口

-(void)orderFront:(id)sender;

4.后置窗口,改变其在屏幕上的顺序

-(void)orderBack:(id)sender;

5.从屏幕上移除,隐藏窗口

-(void)orderOut:(id)sender;

五.窗口通知

当窗口状态变化时候,系统会发出相关通知消息。

NSWindowDidBecomeKeyNotification:窗口成为keyWindow
NSWindowDidBecomeMainNotification:窗口成为mainWindow
NSWindowDidMoveNotification:窗口移动
NSWindowDidResignKeyNotification:窗口不再是keyWindow
NSWindowDidResignMainNotification:窗口不再是mainWindow
NSWindowDidResizeNotification:窗口大小改变
NSWindowWillCloseNotification:关闭窗口

比如说有多个窗口来回切换操作,2个窗口之间会有业务影响,一个窗口的界面数据修改会影响另外一个窗口的界面数据。可以注册NSWindowDidBecomeMainNotification,NSWindowDidBecomeKeyNotification消息,当窗口每次接收到这个消息可以重新获取数据刷新界面。

注册关闭窗口的消息通知,可以在窗口关闭前完成一些资源释放,提醒用户有变化的数据是否需要保存等。

六.contentView

查看NSWindow.h头文件,有2个重要的属性说明一下

@property (strong) id /* NSView * */ contentView;
@property (strong) NSViewController *contentViewController NS_AVAILABLE_MAC(10_10);

通过xib设计window元素布局的话,直接从控件库拖上去就行了。在运行过程中要动态增加view元素到NSWindow的话,使用window的contentView,它代表了window的根视图。

有2种方法改变NSWindow的contentView

1.可以使用自定义的NSView或NSViewController的view,增加到contentView

[self.window.contentView addSubview:view]

2.OSX 10.10系统及以后,创建一个NSViewController子类,实例化后赋值给NSWindow的contentViewController。

NSViewController *myVC = [NSViewController alloc]init];
self.window.contentViewController = myVC;

七.设置window的属性

//设置Window的image和title
[self.window setRepresentedURL:[NSURL URLWithString:@"WindowTitle"]];
[self.window setTitle:@"SQLiteApp"];
NSImage *image = [NSImage imageNamed:@"windowIcon"];
[[self.window standardWindowButton:NSWindowDocumentIconButton] setImage:image];

//设置窗口的背景颜色
[self.window setOpaque:NO];
[self.window setBackgroundColor:[NSColor greenColor]];

//阴影
self.window.hasShadow = YES;  
NSShadow *outShadow = [[NSShadow alloc] init];
outShadow.shadowOffset = NSMakeSize(0, 1);
outShadow.shadowBlurRadius = 1;
outShadow.shadowColor = [NSColor colorWithRed:0 green:0 blue:0 alpha:0.1];
[self.window.contentView setShadow:outShadow];

//圆角
self.window.contentView.wantsLayer = YES;
self.window.contentView.layer.cornerRadius = 8;  
self.window.contentView.layer.masksToBounds = YES;

//点击他处自动隐藏
self.window.hidesOnDeactivate = YES;

//居中 window有记忆功能,会记住上次退出前的位置,所以要把isRestorable设为NO
[self.window setRestorable:NO];
[self.window center];

//控制显示的位置
[self.window setRestorable:NO];
NSRect frame = NSMakeRect(0, 0, 100, 100);
[self.window setFrame:frame display:YES];

参考自《MacOS应用开发基础教程》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值