26

Я хочу создать пользовательскую панель инструментов Window, но без использования реального NSToolbar (потому что в некоторых случаях он не работает правильно в моих случаях, и я не могу его стилизовать так, как я хочу), поэтому Мне нужно добавить subview в заголовок окна. Он должен выглядеть следующим образом: Screenshot of custom ToolbarДобавить Subview в NSWindow Titlebar

А Возможного путь будет:

[[[_window contentView] superview] addSubview:_titlebarView]; 

но есть проблема, что он вызывает предупреждение о Йосемити (NSWindow warning: adding an unknown subview: <NSView: 0x608000122b20>), так что это, кажется, не будет правильный способ сделать это.

В настоящее время я добавляю вид панели инструментов для представления Titlebar:

[[[_window standardWindowButton:NSWindowCloseButton] 
    superview] addSubview:_titlebarView]; 

но чувствует себя тоже неправильно.

Поскольку мое приложение только цели OS X 10,10 (Yosemite) было бы хорошо для меня, чтобы использовать Йосемити-только API, так что я имел взгляд на NSTitlebarAccessoryViewController и мне удалось успешно подкласс и использовать его с NSWindow «s addTitlebarAccessoryViewController: метод. При таком подходе остается одна проблема, возможные значения для layoutAttribute являются:

  • NSLayoutAttributeBottom
    Добавляет вид в нижней части заголовка окна, сохраняя при этом высоту вида.
  • NSLayoutAttributeRight
    Добавляет вид справа от окна заголовка окна, обрезая вид на высоту заголовок.

NSLayoutAttributeBottom не подходит для меня, так как мне нужно расположить вещи правильно в верхней части заголовка окна (см скриншот выше) и центр светофоре. NSLayoutAttributeRight будет именно то, что мне нужно, но я не могу найти способ увеличить высоту заголовка, поэтому представление обрезается до высоты заголовка, что делает его бесполезным для меня. (Примечание. Использование текстурированного окна и изменение границы содержимого не работает, поскольку оно не изменит фактическую высоту заголовка)

Каков рекомендуемый способ для этого? Я бы предпочел пойти с официальными API и использовать подход AccessoryViewController, если бы было возможно, чтобы представление было больше, чем панель заголовков по умолчанию.

+1

Arrgh! Это также подтачивает меня ... – SevenBits

+0

FYI, вы все равно можете использовать тот подход, который используете в настоящее время ... но он просто генерирует предупреждение. – SevenBits

+3

@SevenBits Я знаю, что я могу его использовать, но в примечаниях к выпуску была ясная заметка: «Приложения, выполняющие это, должны будут устранить эту проблему, так как это предотвратит правильную работу новых функций на 10.10». [Mac OS X Developer Release Note] (https://developer.apple.com/library/mac/releasenotes/AppKit/RN-AppKit/) – ePirat

ответ

4

WAYAppStoreWindow может выполнить то, что вы ищете. Он был явно создан, чтобы избежать предупреждения subview в Yosemite, указать пользовательскую высоту заголовка окна и добавить subviews в заголовок.

+0

Спасибо, я уже посмотрел на него, но не могу понять, как добавить subviews. – ePirat

+4

Добавление подзаголовков в их заголовокbarView будет таким же, как и выполнение [[[_window standardWindowButton: NSWindowCloseButton] superiew] addSubview: _customTitlebarView]; ' – ePirat

+0

С El-Capitan светофоры возвращают свое положение, если отображается лист. В полноэкранном режиме есть еще больше проблем. Aaarggh это стало так трудно достичь сейчас. – strangetimes

6

это просто NSToolBar. в Йосемите, когда window.title.titleVisibility = .Hidden, NSToolBar станет заголовком

+1

Как уже упоминалось в моем вопросе по причинам стиля, я не хочу использовать NSToolBar, за исключением того, что был бы способ использовать он выглядит как просмотр и может полностью сконфигурировать его в построителе интерфейса (и использовать автозапуск). Я не думаю, что это возможно. – ePirat

0

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

1

Благодаря @ePirat

Добавление подвидов в их titlebarView, будет такой же, как делают

[[[_window standardWindowButton:NSWindowCloseButton] superview] addSubview:_customTitlebarView]; 
+0

Это на самом деле не очень конструктивный ответ, так как он вообще не помогает ответить на мой вопрос. Он работает, но чувствует себя взломанным, и, похоже, Apple, вероятно, не понравится в App Store Apps. (таким образом, есть дополнительные проблемы в полноэкранном режиме) – ePirat