Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何使用Cocoa创建一个有阴影且没有奇怪标题栏的模式表?_Objective C_Cocoa - Fatal编程技术网

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来看,这种混乱的可用性似乎真的有点奇怪。再次感谢您指出这一点,我能够步行切换到窗口的纹理背景遮罩。