Objective c 如何使用Cocoa创建一个有阴影且没有奇怪标题栏的模式表?
我第一次尝试使用可可纸,但没能达到我想要的效果。因此,一般来说,我需要一个模式表,它阻止对底层窗口的所有输入,并且具有标准窗口阴影,并且没有明确的标题栏。以下是我到目前为止得到的信息: 我通过以下代码实现了这一点:Objective c 如何使用Cocoa创建一个有阴影且没有奇怪标题栏的模式表?,objective-c,cocoa,Objective C,Cocoa,我第一次尝试使用可可纸,但没能达到我想要的效果。因此,一般来说,我需要一个模式表,它阻止对底层窗口的所有输入,并且具有标准窗口阴影,并且没有明确的标题栏。以下是我到目前为止得到的信息: 我通过以下代码实现了这一点: - (BOOL)windowShouldClose:(id)sender { NSRect sheetFrame = NSMakeRect(0, 0, 432, 224); NSWindow* window = [[NSWindow alloc] initWithCo
- (BOOL)windowShouldClose:(id)sender
{
NSRect sheetFrame = NSMakeRect(0, 0, 432, 224);
NSWindow* window = [[NSWindow alloc] initWithContentRect:sheetFrame styleMask:NSWindowStyleMaskBorderless backing:NSBackingStoreBuffered defer:NO];
[window setHasShadow:YES];
window.backgroundColor = [NSColor redColor];
window.titlebarAppearsTransparent = true;
QuitView* quitView = [[QuitView alloc] initWithFrame:sheetFrame];
window.contentView = quitView;
__block SheetController* sheetController = [[SheetController alloc] initWithWindow:_window andSheet:window];
[quitView.noButton setTarget:sheetController];
[quitView.noButton setAction:@selector(quitSheetAndContinue)];
[quitView.quitButton setTarget:sheetController];
[quitView.quitButton setAction:@selector(quitSheetAndAbort)];
[_window beginSheet:window completionHandler:^(NSModalResponse responseCode)
{
sheetController = nil;
if (responseCode == NSModalResponseAbort)
{
[self quit];
}
}];
return NO;
}
- (NSRect)window:(NSWindow *)window willPositionSheet:(NSWindow *)sheet usingRect:(NSRect)rect
{
return NSMakeRect(144, 336, 432, 0);
}
我想解决的问题是:
1删除床单顶部奇怪的灰线有人能解释这是从哪里来的吗?。
2即使按钮不可单击,基础窗口仍接收悬停事件,我可以禁用它吗?
3我希望工作表具有标准的窗口阴影,正如代码片段所示,我试图显式启用它,但没有成功
有人能就上述三点中的一些/全部提供帮助/提示吗?如果其他人觉得这很有用,我可以从中获得一些我需要的东西:
NSWindow* window = [[NSWindow alloc] initWithContentRect:sheetFrame styleMask:NSWindowStyleMaskTitled backing:NSBackingStoreBuffered defer:NO];
window.backgroundColor = [NSColor clearColor];
window.titlebarAppearsTransparent = true;
这给了我一扇窗户,上面有奇怪的阴影,但有一个阴影。遗憾的是,我无法禁用在底层窗口上悬停,但至少在单击时没有执行任何操作,这很好
这是Swift和Xcode 9.1中的故事板
class ViewController: NSViewController {
var viewController: NSViewController?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
viewController = self.storyboard?.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "MyModalViewController")) as? NSViewController
}
override func viewWillAppear() {
//self.presentViewControllerAsSheet(viewController!)
self.presentViewControllerAsModalWindow(viewController!)
self.view.window?.center()
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
class MyModalViewController: NSViewController {
@IBAction func buttonPressed(_ sender: NSButton) {
dismissViewController(self)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do view setup here.
}
override func viewWillAppear() {
self.view.window?.titleVisibility = .hidden
self.view.window?.titlebarAppearsTransparent = true
self.view.window?.styleMask.insert(.fullSizeContentView)
self.view.window?.styleMask.remove(.closable)
self.view.window?.styleMask.remove(.fullScreen)
self.view.window?.styleMask.remove(.miniaturizable)
self.view.window?.styleMask.remove(.resizable)
self.view.window?.isMovable = false
}
}
您也可以为主窗口实现所需的样式掩码。主窗口是可移动的,但正在放置self.view.window?.isMovable=false
到ViewController视图,将显示为禁用移动
在MyModalViewController中,在解除ViewControllers之前,您可以使用let vc=presenting as启用它!ViewController和vc.view.window?.isMovable=在解除控制器之前为true。解决所有问题的简单方法是使用一个视图控制器,并将其作为一个工作表显示在另一个工作表上。@ElTomato PresentViewControllerAsheet:似乎仅从10.10开始提供。是否有任何10.9或更低版本的操作系统兼容解决方案?您的主题没有提到与4年或更老的操作系统的兼容要求。它从何而来?@ElTomato-它来自一个悲惨的事实,即我们的一部分用户群仍然存在于这个4年历史的操作系统上。我记得你说过你需要与10.9甚至更低版本兼容。titlebarAppearsTransparent仅为10.10+。@Kenthomass噢,谢谢你指出这一点,我错过了。作为OSX开发的新手,有没有一种方法可以真正了解所施加的限制?就像运行一些告诉你的工具一样——你的API调用将你限制在10.x或者其他什么?或者我必须手动将所有SDK放在我的机器上,并尝试针对它们进行构建?如果您能够使用Xcode 9或更高版本进行构建,同时仍以部署到较旧的操作系统为目标,那么会出现一个新的警告—Wunguarded availability(无可用性)。您可以使用新的伪函数@available或_builtin_available在运行时检查可用性,编译器会将其理解为受保护的,因此不会发出警告。@KenThomases-非常感谢,然后我将升级到Xcode 9。从Windows来看,这种混乱的可用性似乎真的有点奇怪。再次感谢您指出这一点,我能够步行切换到窗口的纹理背景遮罩。