Я создал проект HelloWorld macOS SwiftUI и вижу параметр EnterFullScreen в меню «Вид», так как я могу удалить этот параметр и отключить его из bace в SwiftUI?
@main
struct testApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
И, к сожалению, вы не можете просто отфильтровать его один раз, а постоянно, потому что macOS вставляет его каждый раз, когда вы открываете меню (в отличие от Start Dictation
и Emoji and Symbols
в меню «Правка», которые вставляются один раз при создании меню «Правка»). Если ответ Йоакима вам подходит, сделайте это. Если нет, просто оставьте комментарий, и я постараюсь найти время, чтобы дать ответ о том, как его отфильтровать, но, хотя это не так сложно, это не тривиальный объем работы.
Самый простой способ — определить максимальный размер вашего представления, а затем указать оконной группе использовать размер содержимого в качестве ограничения размера вашего окна.
Например:
struct TestApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.frame(maxWidth: 400, maxHeight: 500)
}
.windowResizability(.contentSize)
}
}
Поскольку теперь окно не может превышать установленный вами размер, оно не может быть полноэкранным, и SwiftUI автоматически отключает этот параметр в меню.
После небольшого эксперимента кажется, что .windowResizability(.contentSize)
требуется максимальный размер просмотра, меньший, чем экран — если вы укажете значения, превышающие текущее разрешение экрана, опция полноэкранного режима снова будет включена.
Конечно, вы можете опустить максимум, и в этом случае окно будет иметь фиксированный размер в зависимости от содержимого.
Вы упускаете суть, вопрос про пункт меню на весь экран
Этот код отключает пункт меню.
Они не обязательно такие уж странные — если окно не может быть полноэкранным, то, по-видимому, существует какой-то максимальный размер, на который оно может выйти. И этот принцип можно применить к одной WindowGroup, что может быть полезно для больших приложений, содержащих более одной группы.
Вы можете изменить это, используя UserDefaults
, установив для ключа «NSFullScreenMenuItemEverywhere» значение false, как в этом ответе, но если вы сделаете это в applicationWillFinishLaunching
, как в этом ответе, будет слишком поздно, чтобы вступить в силу, поэтому переместите его в init()
в своем приложении. структура
init() {
UserDefaults.standard.set(false, forKey: "NSFullScreenMenuItemEverywhere")
}
Если вы предпочитаете использовать для этого оболочку свойства AppStorage, это может выглядеть так:
@AppStorage("NSFullScreenMenuItemEverywhere") var fullScreenEnabled = false
init() {
fullScreenEnabled = false
}
Ответ Йоакима об использовании UserDefaults, вероятно, самый чистый способ. Вы можете отфильтровать его, прибегнув непосредственно к AppKit, но вам нужно сделать свой собственный подкласс
NSMenu
, а затем перехватить его в методеinsertItem
, и вы должны сделать это как для меню «Вид», так и для меню «Окно» (потому что, если macOS может' t вставляет его в View, он вставляется в Window). Я должен сделать это в пакете Swift, который я написал, чтобы управлять главным меню способом, подобным SwiftUI, не столько для его удаления, сколько для обеспечения того, чтобы оно всегда было в конце после динамического заполнения меню.