BoxLayout в Какао

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

Поэтому я задам другой вопрос, который, надеюсь, косвенно поможет мне ответить на предыдущий вопрос. Вот:

(QUESTION_START)

Как создать класс Objective C, эквивалентный по функциональности BoxLayout класс на Java? (Просто щелкните ссылку, изображение на этой странице говорит все, что вам нужно знать о BoxLayout.)

(QUESTION_END)

Любая помощь в правильном направлении будет оценена по достоинству!

Есть несколько подзадач, связанных с вопросом, например

«Как мне спросить элемент пользовательского интерфейса (например, кнопку), насколько большим он должен быть» (до того, как он будет отображен на экране). Чтобы нарисовать его на экране, вы должны знать его размер, не так ли? Очевидно, приложение-конструктор интерфейсов нашло способ сделать это.

Я знаю, что многие разработчики Cocoa думают, что даже пробовать то, что я хочу, - глупая идея. Позвольте мне сказать вам: я знаю причины этого мнения. Прямо сейчас компоновка элементов управления без построителя интерфейса - отстой, потому что нет ничего, что даже близко подошло бы к менеджеру компоновки в какао. Но если вы считаете мой вопрос глупым, пожалуйста, НЕ отвечайте. Весь Интернет полон объяснений, почему вы никогда не захотите создавать пользовательские интерфейсы с кодом на какао.

Спасибо!


person Michael    schedule 07.06.2011    source источник


Ответы (1)


Ответить на ваш первый вопрос довольно сложно и довольно сложно, поэтому сначала я собираюсь погрузиться в ваш подвопрос:

Как мне спросить элемент пользовательского интерфейса (например, кнопку), насколько большим он должен быть?

Когда вы создаете элемент пользовательского интерфейса, вы сообщаете ему, насколько он должен быть большим (а также где он должен быть) через его конструктор initWithFrame:; или вы можете установить его фрейм позже с помощью метода setFrame:. Затем он втянется в это пространство. Вы можете получить рамку элемента с помощью его frame метода.

Имея это в виду, класс BoxLayout гипотетически мог бы быть контроллером какого-то типа, в который вы могли бы добавлять элементы пользовательского интерфейса, а затем контроллер BoxLayout размещал бы их в сетке (или чем-то еще) на каком-то NSView.

Я знаю, что вы не искали ответов, которые ставят под сомнение мотивы, но, учитывая сложность класса BoxLayout по сравнению с компоновкой интерфейса в IB, кажется уместным спросить, почему вы хотите это сделать.

person mipadi    schedule 07.06.2011
comment
Что ж, я не думаю, что работать с Interface Builder так просто, просто это намного проще, чем работать с кодом, потому что работать с кодом ужасно. Если я хочу создать только представление с двумя кнопками в нем, я думаю, что будет немного излишним создавать файл с пером и собственный класс контроллера только для обработки двух кнопок. Было бы неплохо иметь возможность создать окно с двумя кнопками в методе (window=[Window new]; button = [Button new]; [window add: button]; [button setTarget: self selector:@selector(doit:)]; [window show]) или что-то в этом роде. - person Michael; 08.06.2011
comment
И я действительно не хочу называть -initWithFrame :. Button должен сам по себе знать, какого размера он будет. Было бы плохо открывать IB для каждой кнопки, которую я создал в коде, записывать размеры, а затем помещать их в код. - person Michael; 08.06.2011
comment
Я имею в виду, что большинство элементов управления имеют естественный размер. Рядом с окном комментариев, в котором я пишу этот код, есть кнопка «Добавить комментарий». Как вы думаете, HTML-код сообщает ему, каковы его размеры? Сколько пикселей должно быть в ширину? Нет, Firefox может понять это и дает ему необходимое пространство. Почему Какао не может сделать то же самое для меня? - person Michael; 08.06.2011
comment
@Michael: Я уверен, что есть размер по умолчанию, если вы вызываете, например, -[NSButton init], и если вы устанавливаете заголовок, вы можете использовать sizeToFit, чтобы автоматически изменить его размер, чтобы он соответствовал тексту метки. - person mipadi; 08.06.2011
comment
(по крайней мере, конструктор интерфейса придумал способ подходящего размера кнопок. Я могу увеличивать или уменьшать размер вручную, но из коробки у них есть только правая сторона. Однако мои вопросы не касаются конкретно кнопок. Это просто пример.) END_OF_COMMENT_LIST - person Michael; 08.06.2011
comment
@Michael: Но по правде говоря, иерархия элементов управления пользовательского интерфейса Cocoa разработана для совместной работы с Interface Builder. Вы можете разрабатывать пользовательские интерфейсы программно, но тогда вы работаете против системы и можете рассчитывать, что вам придется проделать некоторую работу самостоятельно. (И, честно говоря, я думаю, что IB - действительно одна из жемчужин в цепочке разработки OS X.) - person mipadi; 08.06.2011
comment
@mipadi: спасибо! Я попробую это. :-) Я только что проверил документацию ... Класс NSControl определяет -sizeToFit и -calcSize. Может это именно то, что мне нужно. - person Michael; 08.06.2011
comment
Может быть, вы правы. Но во мне есть еще и интеллектуальное любопытство; Мне просто нравится знать, как все работает. - person Michael; 08.06.2011
comment
@Michael: В Интерфейсном Разработчике не так много волшебства. Он создает XML-файл с некоторыми значениями, которые в конечном итоге считываются и используются для вызова таких методов, как initWithFrame:, с этими значениями. Элементы управления, поставляемые в библиотеке IB, предварительно настроены с некоторыми значениями и параметрами по умолчанию. - person mipadi; 08.06.2011
comment
Я только что протестировал и -sizeToFit работает! NSButton *button = [NSButton new]; [button setTitle:@"YEAH"]; [button sizeToFit]; NSRect bbounds = [button bounds]; NSRect sbounds = [self bounds];, а затем я могу использовать -setFrame и -addSubview, например, центрируйте кнопку в представлении. - person Michael; 08.06.2011