繁体   English   中英

如何在 Mac OS X 10.15.2 (Catalina) 上使用 Obj-C、Xcode 11.3.1 在代码中重新定义应用程序窗口的大小/来源,覆盖 nib/xib 文件参数?

[英]How do I re-define size/origin of app window in code, overriding nib/xib file parameters, with Obj-C, Xcode 11.3.1 on Mac OS X 10.15.2 (Catalina)?

我会尽量保持简短。 我想为我自己创建一个可以在多个平台上运行的 3D FPS 游戏,但我认为为了简单起见,也许最好从 macOS 专用的东西开始。 我选择 Objective-C 是因为

(a) Xcode 中的 Window Application 项目只能用 Obj-C 或 Swift 编码(因为我们正在处理 Cocoa API)和

(b) Obj-C 比 Swift 更接近于老派。

但在我学会通过编写代码在窗口的画布上绘制/渲染 2D 形状之前,我必须学会调用一个应用程序窗口,并根据自己的喜好设置其属性。 我花了几个小时做研究和试验代码块。 这就是我尝试过的:我打开

#import <Cocoa/Cocoa.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {

那我跟...

1)

        NSWindow *window = [[[NSApplication sharedApplication] windows] firstObject];
        NSRect frame = [window frame];
        frame.origin.x = 100;
        frame.origin.y = 200;
        frame.size.width = 100;
        frame.size.height = 500;
        [window setFrame: frame display: YES];

...并关闭...


        NSApplicationMain(argc, argv); // runs the win display function.
    }

    return (0) ;
}

但没有明显的变化。 什么都不会真正重置。 所以我尝试了而不是(1)...

2)

        NSWindow *window = [[[NSApplication sharedApplication] windows] firstObject];
        NSPoint newOrigin;
        newOrigin.x = 400;
        newOrigin.y = 100;
        [window setFrameOrigin : newOrigin];

依然没有。 然后我尝试了而不是(2):

3)

 NSWindowController* controller = [[NSWindowController alloc]
            initWithWindowNibName:@"MainMenu"];
        [controller showWindow:nil];

伟大的。 现在它吐出一些我不明白的东西,特别是因为我是 Obj-C 的新手:

2020-02-08 21:53:49.782197-0800 
        tryout_macApp2[14333:939233] [Nib Loading] Failed 
        to connect (delegate) outlet from 
        (NSWindowController) to (AppDelegate): missing 
        setter or instance variable

我记得使用 ApplicationDelegate、CGSizeMake() 等等,但它只是让体验真的淹没和令人沮丧。 什么都没有发生。 然后是 NSView、NSViewController 和其他类,这真是令人难以置信并引出了一个问题:为什么有这么多类,而我只想覆盖窗口的预设原点和 MainMenu.xib 文件预设的尺寸? (顺便说一下,这个项目是从 Xcode 提供的一个 Window Application 项目派生出来的。)

我真的想不出还有什么可以补充给你我的困境的全貌,所以如果你觉得缺少什么,请插话。

[编辑:] 在此处进入我的项目的第 2 阶段: 如何使用 Xcode 在 Mac OS X 上的 Obj-C 中仅用几行在我的窗口画布上绘制/绘制/渲染一个点或着色一个像素? .

简短的回答是main()尝试这样做还为时过早。 相反,在您的应用程序委托类上实现-applicationDidFinishLaunching:并在那里执行。 保留main()因为它最初是由 Xcode 的模板创建的。

在那之后,我会说要获取窗口(如果只有一个主窗口),最好向您的应用程序委托添加一个插座,然后在 NIB 中将该插座连接到窗口。 然后,您可以在想要引用窗口时使用该出口。

此外,请确保为 NIB 中的窗口禁用启动时可见。 这样您就可以在显示之前根据需要对其进行配置。

对于更复杂的应用程序,最好不要在主菜单 NIB 中放置窗口。 相反,为窗口创建一个单独的 NIB。 然后,使用 window 控制器对象加载它并询问它的window

我喜欢Objective-C,但也能感受到你的痛苦,它有一种让你无休止地挫败的暴躁能力。

我还没有真正开发出游戏,但让我尝试为您指明正确的方向。 我认为你需要一个 UIViewController。

现在每个 UIViewController 都有一个内置的 UIView,它代表了它的可见部分。 您可以使用它或添加一个 UIView 并使用它,这取决于您的实现。 现在我建议添加一个单独的 UIView 并使用它。 一旦您感到舒适,您就可以根据需要将实现移动到 UIViewController 的视图中。

无论如何,现在,创建一个 UIView 子类,比如 MyGame 之类的,至于现在你所有的代码都将在那里结束。

要做到以上所有这些并不容易,尤其是第一次。 如果您可以遵循一些教程,那就太好了。 即使教程只是添加了一个按钮,您也可以使用它并用您的视图替换该按钮。

无论如何,既然您已经开始运行,并且您添加的视图以绿色或其他霓虹色显示,只是为了验证您确实可以更改其属性,那么您就可以开始了。

现在你开始。 在 MyGame 中,实现-(void)drawRect:(CGRect)rect消息,通过UIGraphicsGetCurrentContext获取上下文并开始在其上绘制线条和内容,基本上是我了解您感兴趣的内容。 您还可以通过相同的上下文,更改您正在做的事情的起源。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM