NavigationSplitView в SwiftUI 2022

На недавней конференции WWDC 2022 Apple представила новинки фреймворка SwiftUI, уделив значительное внимание навигации.

Код на GitHub

Работа с навигацией действительно стала лучше. Я попробовал новый компонент – NavigationSplitView – и обнаружил, что он достаточно капризен на трехколоночной вёрстке и при адаптации к разной ширине имеет некоторые проблемы.

Официальный пример из сессии с рецептами навигации работает некорректно при сжатии до .compact размера — перестает работать навигация из левой панели (сайдбара).

Я подобрал более-менее нормальный подход к работе с трехколоночным Split View, при котором не требуется добавлять костыли и проверки на ширину.

Читать далее «NavigationSplitView в SwiftUI 2022»

Простое кроссплатформенных использование модификаторов в SwiftUI

Когда на 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.

Читать далее «Простое кроссплатформенных использование модификаторов в SwiftUI»

How to change default image on button in AVRoutePickerView

Как запускать 32-битные приложения в macOS Big Sur (почти)

С выходом 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

macOS Mojave on macOS Big Sur in VirtualBox

После установки (долгой) можно изменить разрешение экрана виртуальной машины командами в Терминале:

cd /Applications/VirtualBox.app/Contents/MacOS
и
VBoxManage setextradata "High Sierra" VBoxInternal2/EfiGraphicsResolution 1920x1080

После обязательно установите Guest Additions.

Как создать американскую учётную запись Apple ID

Иногда чего-то нет в русском сторе: книг, приложений… но есть в американском.

С некоторых пор для создания американского аккаунта и вообще требуется двухфакторная идентификация по номеру телефона. Использовать виртуальные номера крайне небезопасно. Иное — 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 PRIME

Мне наконец-то приехал предзаказанный летом корпус от LUNA Design. И я смею утверждать, что это лучший ПК-корпус, что я вообще видел вживую или на Ютубе.

Сегодня с утра записал краткую распаковку и разбор. Наслаждайтесь:

Видео Часы 4K

Сделали с Александром Воробьёвым приложение для Apple TV с красивейшими 4K видео Карелии и окрестностей. Если у вас есть приставка, вы можете найти его в поиске по запросу Video Clock 4K либо Видео Часы 4K. Приложение доступно совершенно бесплатно!

https://apps.apple.com/us/app/video-clock-4k/id1107892109

Применение макросов к модификаторам в SwiftUI

В прошлой статье о разработке приложений на SwiftUI я использовал следующий макрос вокруг блок кода, чтобы он соответсвенно присутствовал только в сборке под Catalyst:

Подобных макросов в Swift и SwiftUI несколько, например, есть еще

Так как не все API в SwiftUI доступны на всех платформах, то макросы оказываются крайне полезными. Приведу живой пример: focusable – это модификатор, недоступный на iOS.

Раз так, то если вы пишите код, который должен работать на всех платформах, то вам необходимо обернуть этот модификатор проверяющим макросом.

Да вот беда: сделать этого нельзя! Подобные строки добавленные в цепочку модификаторов вызывают ошибку компиляции:

ПК на базе Luna Design PRIME

Недавно задумался купить себе компьютер в дополнение к рабочему MacBook Pro 16″. Но последовательным изучением линейки актуальных ноутбуков и компьютеров Apple пришел к выводу, что либо мне не нужен свой макбук (я ведь всегда могу открыть рабочий ноут), либо мне нужен точно такой же, как рабочий, а он стоит почти 200 тысяч рублей. Это очень дорого.

Потом я вспомнил, что у дочери уже совсем на ладан дышит Mac mini 2011 и обратился к современному рынку компьютерных комплектующих. Таким образом родилась очень странная на первый взгляд, но оправданная сборка.

Как настроить внешний вид Sidebar панели NavigationView в Catalyst-приложении в SwiftUI

Для тех, кому невтерпеж ссылка на сниппет: https://gist.github.com/SoundBlaster/05362e2ee026a524f2489483edcb777d

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

Боковая левая панель NavigationView ни за что не захочет становиться прозрачной с присущим всем новым приложениям macOS эффектом затуманенного стекла или блюра. Для этого в SwiftUI существует специальный модификатор:

Но данный модификатор не оказывает должного воздействия при сборке с целевым назначение 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):

Последний штрих: скрываем для macOS панель заголовка окна:

Готово!

UPD 31.05.2021

Еще одно интересное решение этой проблемы представлено в репозитории https://github.com/steventroughtonsmith/CatalystSidebarToolbar