Как мне переопределить размер / происхождение окна приложения в коде, переопределяя параметры файла nib / xib, с Obj- C, Xcode 11.3.1 на Ma c OS X 10.15.2 (Catalina)? - PullRequest
0 голосов
/ 09 февраля 2020

Я постараюсь быть коротким. Я хочу создать 3D FPS-игру для себя, которая может работать на нескольких платформах, но я решил, что для простоты лучше начать с чего-то, что предназначено исключительно для macOS. Я выбрал Objective- C, потому что

(a) Проекты Window Application в XCode можно кодировать только в Obj- C или Swift (так как мы имеем дело с Cocoa API) и

(б) Obj- C ближе к старой школе, чем Свифт.

Но прежде чем я научусь рисовать / визуализировать 2D-фигуры на холсте окна, написав код, я должен научиться вызывать окно приложения со свойствами, которые мне нравятся. Я часами проводил исследования и экспериментировал с кусками кода. Вот что я попробовал: я открываю с

#import <Cocoa/Cocoa.h>

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

Затем я go с ...

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 (), et c ., но это только сделало опыт действительно затопляющим и расстраивающим. Ничего не случилось. Тогда есть NSView, NSViewController и другие классы, которые действительно ошеломляют и напрашиваются на вопрос: почему так много классов, когда все, что я хочу сделать, это переопределить предустановленный источник окна и размеры, предустановленные файлом MainMenu.xib ? (Кстати, этот проект является производным от проекта Window Application, предоставленного Xcode.)

Я действительно не могу придумать, что еще можно добавить, чтобы дать вам полную картину моего затруднительного положения, поэтому, если вы чувствуете, что-то отсутствует, пожалуйста, включите.

[Редактировать:] Переход к этапу 2 моего проекта здесь: Как нарисовать / нарисовать / визуализировать точку или раскрасить пиксель на холсте мое окно с несколькими строками в Obj- C на Ma c OS X с использованием Xcode? .

Ответы [ 2 ]

2 голосов
/ 09 февраля 2020

Короткий ответ: main() слишком рано, чтобы пытаться это сделать. Вместо этого реализуйте -applicationDidFinishLaunching: в своем классе делегата приложения и делайте это там. Оставьте main(), как это было изначально создано шаблоном Xcode.

После этого, я бы сказал, чтобы получить окно (если будет только одно главное), лучше добавить выход в ваше приложение. делегировать, а затем, в NIB, подключить эту розетку к окну. Затем вы можете использовать эту розетку, когда захотите обратиться к окну.

Кроме того, убедитесь, что Visible at Launch отключена для окна в NIB. Поэтому вы должны настроить его так, как хотите, прежде чем показывать его.

Для более сложного приложения, вероятно, лучше не помещать окно в NIB главного меню. Вместо этого сделайте отдельный NIB для окна. Затем загрузите его, используя объект контроллера окна, и попросите его для window.

0 голосов
/ 09 февраля 2020

Мне нравится Объектив- C, но я также чувствую твою боль, у меня есть эта вызывающая способность бесконечно расстраивать тебя.

Я не очень разработал игру, но позвольте мне попытаться указать тебе правильное направление , Я думаю, что вам нужен UIViewController.

Теперь у каждого UIViewController есть встроенный UIView, который как бы представляет его видимую часть. Вы можете использовать это или добавить UIView и использовать это, в зависимости от вашей реализации. На данный момент я бы предложил добавить отдельный UIView и использовать его скорее. Как только вы почувствуете себя комфортно, вы можете переместить реализацию в представление UIViewController, если вам нужно.

Во всяком случае, пока, создайте подкласс UIView, скажем, MyGame или что-то еще, поскольку на данный момент весь ваш код закончится там.

Сделать все вышеперечисленное непросто, особенно если это в первый раз. Если вы можете следовать некоторому руководству, это будет здорово. Даже если в учебном пособии просто добавлена ​​кнопка, вы можете использовать ее и заменить кнопку своим представлением.

В любом случае, теперь, когда у вас это работает, и добавленное представление отображается зеленым или каким-то другим другой неоновый цвет просто для того, чтобы убедиться, что вы действительно можете изменить его свойства, вам нужно go.

Теперь начнем. В MyGame реализуйте сообщение -(void)drawRect:(CGRect)rect, перехватите контекст через UIGraphicsGetCurrentContext и начните рисовать линии и прочее на нем, в основном то, что, как я понимаю, вам интересно. В том же контексте вы также можете изменить происхождение того, что вы делаете.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...