Мак-катализатор - как сделать окно минимального размера?
Mac катализатор позволяет изменить размер окна, в любом случае, чтобы обеспечить минимальный размер окна для приложения катализатора Mac?
1 ответ
Просто добавьте следующий фрагмент кода в свой application:didFinishLaunchingWithOptions
метод (для проектов UIKit) илиscene(_:willConnectTo:options:)
(для проектов SwiftUI):
UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.forEach { windowScene in
windowScene.sizeRestrictions?.minimumSize = CGSize(width: 480, height: 640)
}
PS: вы также можете установить maximumSize
собственность там
PS2: Если вы установите оба minimumSize
а также maximumSize
с тем же значением размер окна останется неизменным и его нельзя будет изменить.
Вот расширенная версия отличного ответа @marcelosalloum..
Шаг 1. Откройте AppDelegate.swift.
Шаг 2. Найдите приложение func (), вставьте сюда свою версию кода @marcelosalloum (или вызовите функцию, которую вы создали для этого, как это сделал я).
Шаг 3. При желании можно утверждать, что ваш код работает только на платформах с подходящими API Swift (используйте #available).
Пример кода (в AppDelegate.swift)
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
addWindowSizeHandlerForMacOS()
return true
}
func addWindowSizeHandlerForMacOS() {
if #available(iOS 13.0, *) {
UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.forEach { windowScene in
windowScene.sizeRestrictions?.minimumSize = CGSize(width: 800, height: 1100)
windowScene.sizeRestrictions?.maximumSize = CGSize(width: 800, height: 1100)
}
}
}
Пример снимка экрана
В моем приложении я определил функцию с именем addWindowSizeHandlerForMacOS(), начиная со строки 23. Затем я вызвал ее из application () в AppDelegate.swift (строка 18).
Внутри вашего делегата сцены вы можете сделать следующее:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
guard let scene = (scene as? UIWindowScene) else { return }
#if targetEnvironment(macCatalyst)
scene.sizeRestrictions?.minimumSize = CGSize(width: 800, height: 1100)
scene.sizeRestrictions?.maximumSize = CGSize(width: 1280, height: 1200)
#endif
}
Реализуйте класс Objective C с этим методом:
- (void)setMinimumSize:(CGSize)size {
id app = NSClassFromString(@"NSApplication");
id shared = [app valueForKeyPath:@"sharedApplication"];
id mainWindow = [shared valueForKeyPath:@"mainWindow"];
NSValue *nssize = [NSValue valueWithCGSize:size];
[mainWindow setValue:nssize forKeyPath:@"minSize"];
}
Для звонков из Swift - используйте заголовок моста.
Objective-C версия ответа @marcelosalloum:
for (UIScene* scene in UIApplication.sharedApplication.connectedScenes) {
if ([scene isKindOfClass:[UIWindowScene class]]) {
UIWindowScene* windowScene = (UIWindowScene*) scene;
windowScene.sizeRestrictions.minimumSize = CGSizeMake(480, 640);
}
}
Использовать sizeRestrictions?.minimumSize
или sizeRestrictions?.maximumSize
, чтобы установить минимальный или максимальный размер окна приложения Mac.
Открыть свой SceneDelegate
а также:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let scene = (scene as? UIWindowScene) else { return }
scene.sizeRestrictions?.minimumSize = CGSize(width: 800, height: 600)
scene.sizeRestrictions?.maximumSize = CGSize(width: 800, height: 600)
}
Просто добавьте это в свой делегат сцены:
window?.windowScene?.sizeRestrictions?.minimumSize = CGSize(width: 900.0, height: 750.0)
Я также добавил, как установить максимальный размер как максимально возможное значение:
window?.windowScene?.sizeRestrictions?.maximumSize = CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude)
Я провел небольшое исследование. Итак, я сделал следующее дополнение к моей сцене с функцией SceneDeleg ate:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
if UIDevice.current.systemName.contains("Mac") {
window?.windowScene?.sizeRestrictions?.minimumSize = CGSize(width: 1024, height: 768)
} else {
// iOS - nothing to change
}
Я не уверен, что если требуется предложение системного имени, поскольку window.windowScene.sizeRestrictoins равно нулю для iOS, но добавил это для ясного понимания и возможных будущих обновлений.
Я выбираю 1024x768 как наименьший размер iPad в альбомной ориентации (Catalyst сообщает об устройстве как iPad с Mac OS в ландшафтном режиме)