我的Cocoa应用程序需要一些动态生成的小窗口.如何在运行时以编程方式创建Cocoa窗口?
到目前为止,这是我的非工作尝试.我看不到任何结果.
NSRect frame = NSMakeRect(0, 0, 200, 200);
NSUInteger styleMask = NSBorderlessWindowMask;
NSRect rect = [NSWindow contentRectForFrameRect:frame styleMask:styleMask];
NSWindow * window = [[NSWindow alloc] initWithContentRect:rect styleMask:styleMask backing: NSBackingStoreRetained defer:false];
[window setBackgroundColor:[NSColor blueColor]];
[window display];
Run Code Online (Sandbox Code Playgroud) 我想让我NSWindow:
F11)以下就是这样,但有副作用:
[self setCollectionBehavior: NSWindowCollectionBehaviorCanJoinAllSpaces
| NSWindowCollectionBehaviorStationary ];
Run Code Online (Sandbox Code Playgroud)
切换到Mac OS X Lion上的仪表板时,窗口仍然可以单独显示仪表板项目一秒钟,然后隐藏.
这是预期的行为还是一个错误?我的应用程序的用户发现在仪表板消失之前看到仪表板上的窗口会让人感到困惑.我原以为他们只能在Spaces而不是Dashboard上展示.
我有一个Cocoa应用程序,有一个NSWindowController控制NSWindow与NSComboBox它.没什么特别的,它在升级到OS X 10.7.2之前工作正常.现在我得到以下异常,当窗口控制器的窗口加载时,该异常只发生一次.(由于我的应用程序中的窗口控制器仍然加载,每次应用程序启动时只会发生一次.)随后聚焦和取消聚焦组合框不会触发它.
任何人都知道10.7.2中是否有变化,如果有变化,如何解决它?
(这与Xcode 4.2一起发生.)
2011-10-24 11:30:21.649 MyApp[7934:707] Unlocking Focus on wrong view ((null)), expected <NSComboBox: 0x40083d6e0>
2011-10-24 11:30:21.653 MyApp[7934:707] (
0 CoreFoundation 0x00007fff8412d286 __exceptionPreprocess + 198
1 libobjc.A.dylib 0x00007fff88cdad5e objc_exception_throw + 43
2 CoreFoundation 0x00007fff8412d0ba +[NSException raise:format:arguments:] + 106
3 CoreFoundation 0x00007fff8412d044 +[NSException raise:format:] + 116
4 AppKit 0x00007fff8c76c1d5 -[NSFocusStack unfocusView:] + 194
5 AppKit 0x00007fff8c7e838e +[_NSAutomaticFocusRing showForView:] + 2545
6 AppKit 0x00007fff8cdbb4d1 __postActiveFirstResponderChanged_block_invoke_1 + 32
7 CoreFoundation 0x00007fff840ecf37 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23 …Run Code Online (Sandbox Code Playgroud) 在Objective-C for Cocoa Apps中,可以使用这种方式使窗口始终保持最佳状态?
如何用Swift实现同样的目标?
self.view.window?.level = NSFloatingWindowLevel
Run Code Online (Sandbox Code Playgroud)
导致构建错误 Use of unresolved identifier 'NSFloatingWindowLevel'
我的应用程序使用故事板,窗口必须使用自定义类MyWindow,或者在运行时/启动应用程序,有一条错误消息说:
Interface Builder文件中的未知Window类(null),而是创建通用Window
升级到Xcode 9.1之后我才注意到这一点,但我不确定它是否曾存在过.
类似的问题在这里:Xcode 6 Strange Bug:Interface Builder文件中的未知类
我的另一个项目没有这个问题.我稍后会调查.
在这两个项目中,窗口由自定义窗口控制器拥有.我检查了故事板xml但没有找到任何奇怪的东西.
我有一个包含两个窗口的NIB,一个是启动时可见的应用程序主窗口,另一个是自定义工作表(因此在启动时不可见).当需要工作表时,我的控制器会调用:
[NSApp beginSheet: sheetWindow modalForWindow: mainWindow modalDelegate: self didEndSelector: @selector(didEndSheet:returnCode:contextInfo:) contextInfo: nil];
它显示工作表窗口并启动模态会话,但窗口有一个标准的Aqua标题栏,没有"连接"到主窗口,可以像常规窗口一样移动.不用说,这是不可取的:-).为什么表单窗口"弹出"它所运行的窗口,就像工作表通常以这种方式开始时一样?
我想知道我是否在控制器内部开始工作表的事实-awakeFromNib可能会产生影响,所以我将工作表移动到按钮的动作,我可以稍后触发.这并未改变行为.我没有想过要尝试的任何其他事情.我的目标是10.5 SDK,使用Xcode 3.1.
编辑:所以看起来我已经创建了一个模态对话框; 工作表和应用程序模式对话框都是使用该-beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:方法启动的.但是,如何指示我的窗口应该是工作表而不是模态对话框?
我目前正在尝试创建一个类似于Volume OS X窗口的窗口:

为了做到这一点,我有自己的NSWindow(使用自定义子类),透明/无标题栏/无阴影,NSVisualEffectView在其contentView内部.这是我的子类的代码,使内容视图轮流:
- (void)setContentView:(NSView *)aView {
aView.wantsLayer = YES;
aView.layer.frame = aView.frame;
aView.layer.cornerRadius = 14.0;
aView.layer.masksToBounds = YES;
[super setContentView:aView];
}
Run Code Online (Sandbox Code Playgroud)
这就是结果(正如你所看到的,角落是颗粒状的,OS X更平滑):
关于如何使角落更平滑的任何想法?谢谢
我注意到OS X上的所有应用程序似乎都保存了你设置它的大小.下次打开时,它通常位于相同的位置和大小.
我正在制作应用程序,我注意到在调整大小后,如果我再次启动应用程序,它只是我在Xcode 4的IB中设置的大小而不是我在启动时调整大小的大小.
每次更改窗口大小时是否必须手动保存?或者通过IB有更简单的方法吗?(如果更改了任何内容,我的窗口会设置最小尺寸.)
我正在尝试创建一个NSWindow没有标题栏(NSBorderlessWindowMask)的圆角和阴影,类似于下面的"欢迎使用Xcode"窗口.

我做了一个子类NSWindow:
@implementation FlatWindow
- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag
{
self = [super initWithContentRect:contentRect styleMask:NSBorderlessWindowMask backing:bufferingType defer:flag];
if ( self )
{
[self setOpaque:NO];
[self setBackgroundColor:[NSColor clearColor]];
[self setMovableByWindowBackground:TRUE];
[self setStyleMask:NSBorderlessWindowMask];
[self setHasShadow:YES];
}
return self;
}
- (void) setContentView:(NSView *)aView
{
aView.wantsLayer = YES;
aView.layer.frame = aView.frame;
aView.layer.cornerRadius = 10.0;
aView.layer.masksToBounds = YES;
[super setContentView:aView];
}
@end
Run Code Online (Sandbox Code Playgroud)
还有一个子类NSView:
@implementation ColoredView
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
[[NSColor windowBackgroundColor] set];
NSRectFill(dirtyRect); …Run Code Online (Sandbox Code Playgroud) nswindow ×10
cocoa ×6
objective-c ×5
macos ×4
swift ×2
xcode ×2
apple-expose ×1
cocoa-sheet ×1
nsresponder ×1
nsview ×1
osx-lion ×1
resize ×1
spaces ×1
storyboard ×1
swift2 ×1
swift3 ×1
xcode4.2 ×1