Работа с навигацией действительно стала лучше. Я попробовал новый компонент – NavigationSplitView – и обнаружил, что он достаточно капризен на трехколоночной вёрстке и при адаптации к разной ширине имеет некоторые проблемы.
Официальный пример из сессии с рецептами навигации работает некорректно при сжатии до .compact размера — перестает работать навигация из левой панели (сайдбара).
Я подобрал более-менее нормальный подход к работе с трехколоночным Split View, при котором не требуется добавлять костыли и проверки на ширину.
Когда на Catalyst пишется приложение для macOS, недоступны некоторые модификаторы View. Например, простой refreshable(action:). Его использование вызывает ошибку не компиляции, а исключение в рантайме:
[General] SwiftUI.SwiftUI_UIRefreshControl is not supported when running Catalyst apps in the Mac idiom. See UIBehavioralStyle for possible alternatives. Consider using a Refresh menu item bound to ⌘-R
Из-за этого можно пропустить в продакшн код, который на платформе не работает на самом деле.
Исправить положение можно, отказавшись от модификатора и его функций, можно написать разные компоненты под разные платформы, но есть способ удобнее и лучше: собственный ViewModifier.
С выходом Catalina остро встала проблема с приложениям для macOS, которые более не обновляются разработчиками по той или иной причине.
С выходом Big Sur проблема только усугубилась, так как Apple без зазрения совести отбрасывает всё бренное и отсталое на своём пути в светлое будущее.
Если у тех, кто работает с такими неподдерживаемыми приложениями давно, ещё есть возможность осознанно не обновлять macOS, то у тех, кто приобретает новые маки такой возможности просто нет.
Неужели нужно покупать на вторичном рынке старый мак ради нескольких приложений? Нет.
Для этого сразу к делу: 1) Для начала отключаем SIP в вашей macOS Big Sur (это вынужденная мера, постоянно работать с выключенным SIP крайне не рекомендуется!!!) 2) Качаем и устанавливаем на Big Sur 11.1 виртуальную машину VirtualBox версии 6.1.17+ 3) Перезагружаем мак 4) Скачиваем образ DMG для macOS Mojave и создаём из него ISO образ 5) Создаём виртуальную машину по инструкции 6) Запускаем и устанавливаем macOS Mojave внутри виртуальной машины VirtualBox 7) Все приложения, несовместимые с Big Sur, с большой долей вероятности запустятся в виртуальной Mojave
После установки (долгой) можно изменить разрешение экрана виртуальной машины командами в Терминале:
cd /Applications/VirtualBox.app/Contents/MacOS и VBoxManage setextradata "High Sierra" VBoxInternal2/EfiGraphicsResolution 1920x1080
Иногда чего-то нет в русском сторе: книг, приложений… но есть в американском.
С некоторых пор для создания американского аккаунта и вообще требуется двухфакторная идентификация по номеру телефона. Использовать виртуальные номера крайне небезопасно. Иное — eSim. Вот рабочий и опробованный мной на iPhone XR способ.
Регистрируем новую почту Gmail
Находим на Google Maps реальный адрес жилого дома, например, в San Francisco, важен и ZIP код
Покупаем прямо в приложении T-Mobile Prepaid eSIM (можно платить с русской банковской карты)
Настраиваем eSim в своём телефоне
Перезагружаем телефон
Идём на сайт Apple ID:
регаем учётку с теми же данными: указываем Gmail и полученный номер T-Mobile
подтверждаем кодами почту и номер
Вы прекрасны!
Осталось ввести платежные данные — например подходящую виртуальную карту VISA (российские могут не подойти) или данные вашего американского PayPal аккаунта.
UPD Также в настройках eSim, возможно, потребуется включить опцию «Вызовы по Wi-Fi».
UPD2
С оплатой будет трудно: даже созданный американский PayPal при попытке оплатить подключенной к нему русской картой (Тинькофф) выпал в ошибку оплаты и требует другую карту.
Выход: попросить друзей в Америке, у кого американский акк, кинуть подарочный купон на iTunes, а взамен перевести им тем же PayPal, но с российского аккаунта, деньги со своей российской карты.
Мне наконец-то приехал предзаказанный летом корпус от LUNA Design. И я смею утверждать, что это лучший ПК-корпус, что я вообще видел вживую или на Ютубе.
Сегодня с утра записал краткую распаковку и разбор. Наслаждайтесь:
Сделали с Александром Воробьёвымприложение для Apple TV с красивейшими 4K видео Карелии и окрестностей. Если у вас есть приставка, вы можете найти его в поиске по запросу Video Clock 4K либо Видео Часы 4K. Приложение доступно совершенно бесплатно!
В прошлой статье о разработке приложений на SwiftUI я использовал следующий макрос вокруг блок кода, чтобы он соответсвенно присутствовал только в сборке под Catalyst:
Подобных макросов в Swift и SwiftUI несколько, например, есть еще
Swift
1
2
3
#ifos(iOS)
...
#endif
Так как не все API в SwiftUI доступны на всех платформах, то макросы оказываются крайне полезными. Приведу живой пример: focusable – это модификатор, недоступный на iOS.
Swift
1
2
3
4
5
@available(macOS10.15,tvOS13.0,watchOS6.0,*)
@available(iOS,unavailable)
extensionView{
public funcfocusable(_isFocusable:Bool=true,onFocusChange:@escaping(Bool)->Void={_in})->some View
}
Раз так, то если вы пишите код, который должен работать на всех платформах, то вам необходимо обернуть этот модификатор проверяющим макросом.
Да вот беда: сделать этого нельзя! Подобные строки добавленные в цепочку модификаторов вызывают ошибку компиляции:
Недавно задумался купить себе компьютер в дополнение к рабочему MacBook Pro 16″. Но последовательным изучением линейки актуальных ноутбуков и компьютеров Apple пришел к выводу, что либо мне не нужен свой макбук (я ведь всегда могу открыть рабочий ноут), либо мне нужен точно такой же, как рабочий, а он стоит почти 200 тысяч рублей. Это очень дорого.
Потом я вспомнил, что у дочери уже совсем на ладан дышит Mac mini 2011 и обратился к современному рынку компьютерных комплектующих. Таким образом родилась очень странная на первый взгляд, но оправданная сборка.
Оказалось, что конфигурация интерфейса по умолчанию, создаваемая для вашего SwiftUI приложения, которое использует Catalyst для работы на macOS, не поддерживает внешний вид, аналогичный нативным приложениям для macOS, пусть даже они написаны на абсолютно идентичных компонентах.
Боковая левая панель NavigationView ни за что не захочет становиться прозрачной с присущим всем новым приложениям macOS эффектом затуманенного стекла или блюра. Для этого в SwiftUI существует специальный модификатор:
Swift
1
public funclistStyle<S>(_style:S)->some View whereS:ListStyle
Но данный модификатор не оказывает должного воздействия при сборке с целевым назначение targetEnvironment(macCatalyst)!
Мне очень хотелось получить такой же внешний вид, как у нового приложения «Ассистент обратной связи»:
Но получалась лишь скучная iOS-подобная панель:
Официально существует способ получить желаемый эффект в Catalyst приложении, но сделать это можно только с помощью UIKit, вручную настраивая и управляя экземпляром UISplitViewController: Apply a Translucent Background to Your Primary View Controller. Этот способ возможен, но добавляет головной боли при связывании панелей логикой навигации, выходящей за рамки SwiftUI. Хотелось получить родное для фреймворка решение.
Я подумал, как обычно бывает в таких ситуация: «Решение точно должно быть!». За годы практики получалось даже исправлять баги в UIKit, что уж говорить о том, чтобы просто включить нужное свойство.
Первым делом обратимся к иерархии компонентов интерфейса:
Ага, UISplitViewController у нас присутствует! Просто он скрыт под капотом имплементации NavigationView и нигде не торчит наружу, а про необходимость влияния на него модификатора listStyle, видимо, либо забыли, либо специально не сделали, чтобы подстегнуть создавать macOS приложения (обожаю теории заговоров!).
Дело за малым – достучаться до инстанса этого класса в иерархии и сделать то, что советует Apple в своём руководстве.
В SceneDelegate.swift в методе SceneDelegate.scene(_:willConnectTo:options:) добавляем поиск контроллера нужного класса:
Но этого мало – UIHostingView левой панели остаётся белой и непрозрачной, скрывая от нас прекрасный размытый фон окна. Штош, ищем вьюшки и убираем фон (так можно, ведь это просто proof-of-concept):