Как я могу отключить и даже удалить опцию EnterFullScreen в меню «Вид» в macOS в SwiftUI?

Я создал проект HelloWorld macOS SwiftUI и вижу параметр EnterFullScreen в меню «Вид», так как я могу удалить этот параметр и отключить его из bace в SwiftUI?

   @main
struct testApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

Ответ Йоакима об использовании UserDefaults, вероятно, самый чистый способ. Вы можете отфильтровать его, прибегнув непосредственно к AppKit, но вам нужно сделать свой собственный подкласс NSMenu, а затем перехватить его в методе insertItem, и вы должны сделать это как для меню «Вид», так и для меню «Окно» (потому что, если macOS может' t вставляет его в View, он вставляется в Window). Я должен сделать это в пакете Swift, который я написал, чтобы управлять главным меню способом, подобным SwiftUI, не столько для его удаления, сколько для обеспечения того, чтобы оно всегда было в конце после динамического заполнения меню.

Chip Jarred 16.11.2022 12:20

И, к сожалению, вы не можете просто отфильтровать его один раз, а постоянно, потому что macOS вставляет его каждый раз, когда вы открываете меню (в отличие от Start Dictation и Emoji and Symbols в меню «Правка», которые вставляются один раз при создании меню «Правка»). Если ответ Йоакима вам подходит, сделайте это. Если нет, просто оставьте комментарий, и я постараюсь найти время, чтобы дать ответ о том, как его отфильтровать, но, хотя это не так сложно, это не тривиальный объем работы.

Chip Jarred 16.11.2022 12:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
76
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Самый простой способ — определить максимальный размер вашего представления, а затем указать оконной группе использовать размер содержимого в качестве ограничения размера вашего окна.

Например:

struct TestApp: App {
      var body: some Scene {
        WindowGroup {
            ContentView()
              .frame(maxWidth: 400, maxHeight: 500)
        }
        .windowResizability(.contentSize)
    }
}

Поскольку теперь окно не может превышать установленный вами размер, оно не может быть полноэкранным, и SwiftUI автоматически отключает этот параметр в меню.

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

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

Вы упускаете суть, вопрос про пункт меню на весь экран

Joakim Danielson 16.11.2022 11:30

Этот код отключает пункт меню.

ScottM 16.11.2022 11:32

Они не обязательно такие уж странные — если окно не может быть полноэкранным, то, по-видимому, существует какой-то максимальный размер, на который оно может выйти. И этот принцип можно применить к одной WindowGroup, что может быть полезно для больших приложений, содержащих более одной группы.

ScottM 16.11.2022 14:39
Ответ принят как подходящий

Вы можете изменить это, используя UserDefaults, установив для ключа «NSFullScreenMenuItemEverywhere» значение false, как в этом ответе, но если вы сделаете это в applicationWillFinishLaunching, как в этом ответе, будет слишком поздно, чтобы вступить в силу, поэтому переместите его в init() в своем приложении. структура

init() {
     UserDefaults.standard.set(false, forKey: "NSFullScreenMenuItemEverywhere")
}

Если вы предпочитаете использовать для этого оболочку свойства AppStorage, это может выглядеть так:

@AppStorage("NSFullScreenMenuItemEverywhere") var fullScreenEnabled = false

init() {
     fullScreenEnabled = false
}

Другие вопросы по теме