Как настроить внешний вид 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 панель заголовка окна:

Готово!

SwiftUI: Новый Rounded стиль текста для заголовка в Navigation Bar

Оказалось, что не так и просто добраться до нового стиля шрифта семейства SF, который анонсировали на WWDC 2019.

После некоторого времени, потраченного безуспешно на поиски примеров на сайте с документацией, а так же на различных сайтах с туториалами и, конечно же, на StackOverflow я решил самостоятельно разобраться, как создавать экземпляр UIFont с помощью UIFontDescriptor с нужным мне face:

Сам же дизайн создать и применить очень просто, если вам лишь нужно изменить шрифт у обычного элемента Text:

К сожалению, изменить такими модификаторами стиль заголовка навбара в SwiftUI нельзя, поэтому приходится использовать UIAppearance протокол. Приведённый в начале код необходимо разместить где-то либо в коде SceneDelegate, либо в init() методе вашего компонента SwiftUI.

Мониторинг и диагностика проблем в приложениях Облака Mail.Ru — Павел Осипов (Mail.ru Group)

Читать далее Мониторинг и диагностика проблем в приложениях Облака Mail.Ru — Павел Осипов (Mail.ru Group)

Изображение из пакета приложения в WebView, React Native, Android

Если вам потребуется отобразить статичный контент в WebView в Android приложении, сделанном на React Native, и при этом использовать в HTML контенте изображения, хранящиеся локально в пакете приложения, то вы можете настроить WebView так, чтобы его source содержал в baseUrl указание на file:///android_asset/тогда в итоге вы сможете отобразить тег img со значением src="./image.png", где image.png – это имя файла изображения, изображение при этом необходимо поместить в папке android/app/src/main/assets. Конечно, вы можете использовать более глубокие пути до папок и файлов и более сложную иерархию каталогов.

iPhone X

Я один обратил внимание на странное устройство экрана в новом iPhone X? Что за второй слой матрицы дисплея, обращенный внутрь?

Источник

Если судить по снимкам iFixit, то так и есть — матрица загнута в нижней части, только не столь красочно, как в ролике это выглядит: 1, 2

JavaScript

Немножко юмора
const a = 0
const b = undefined
const c = 1 / 'a'
console.log(isNaN(a), a, typeof a)
console.log(isNaN(b), b, typeof b)
console.log(isNaN(c), c, typeof c)

Консоль:
false 0 "number"
true undefined "undefined"
true NaN "number"

То есть Not a Number имеет тип number! ?

И бонусом весёлое видео:

P.S. Не стоит воспринимать эту запись слишком серьёзно.

В преддверии iPhone 8

— Хорошо, что они это сделали, потому что технология в Xerox просто провалилась. Почему?
— Почему? Я много думал об этом и я многое потом понял об этом, поработав с Джоном Скалли. И теперь картина ясна. То же самое случилось и с Джоном Скалли. Джон пришел из PepsiCo. И они меняли свой продукт раз в 10 лет. Для них новый продукт это как бутылка нового размера. Так? И если вы менеджер по продукции, вы не меняете кардинально политику компании. Но кто повлиял на успех PepsiCo? Люди из отделов продаж и маркетинга! В итоге именно они получили повышение и стали управлять компанией. Может, с PepsiCo всё было хорошо, но то же самое может случиться с технологическими компаниями, которые становятся монополистами, как IBM или Xerox. Если бы вы были менеджерами по продукции в IBM или Xerox, вы бы выпускали всё новые копиры или компьютеры. В итоге люди, которые приносят успех компании, из отделов торговли и маркетинга, встают во главе компании, а менеджеры по продукции отстраняются от принятия важных решений. И компании забывают, что такое выпускать хорошую продукцию. Чутьё нужной продукции, талант, которые сделали их монополистами, загнивают благодаря тем, кто управляет компанией, которые не представляют концепцию хорошей продукции, в отличии от плохой. Они не понимают искусство хорошей идеи и воплощения её в хорошую продукцию и в глубине души они вовсе не хотят помочь потребителю. Это и случилось с Xerox.

Стив Джобс, «Потерянное интервью», 2012

Хакинтош за 50 тысяч рублей

С недавних пор я работаю за новым MacBook Pro 15″ c процессором Core i7 на 8 потоков – этому я несказанно рад. Но вот чему не рад – это моему домашнему Mac mini 11 года выпуска, в котором стоит старенький Core i5 c 4 потоками. Хоть я и сделал в минике Fusion Drive, добавив SSD на 120 гигабайт, а так же впихнув в него максимум оперативной памяти, доведя её объем до сопоставимых с новым ноутбуком 16 гигабайт, всё равно по главному качеству – производительности – домашний компьютер теперь отстает от рабочего в 3 раза! Этот контраст несколько печалит, так как такое разительное отличие в работе крайне заметно. Миник на фоне ноутбука стал казаться «тормозом», хотя раньше меня он более-менее устраивал.
В связи с этим решил посмотреть, что можно предпринять, чтобы изменить такое положение вещей, так как брать ноутбук с работы не вариант и домашний компьютер надо обновлять. В конце концов ему уже 6 лет!

Читать далее Хакинтош за 50 тысяч рублей

Режим «Картинка в картинке» в macOS Sierra

Забавный случай возник сегодня: у меня есть файл mp4 и установленная macOS Sierra, в которой есть крайне удобный режим просмотра «Картинка в картинке», но посмотреть с помощью плееров в таком режиме файл нельзя! Не умеет этого даже родной QuickTime. В VLC есть опция «Поверх всех окон», но она не поддерживает полноэкранные приложения и рабочие столы, а «картинка в картинке» – поддерживает. Например, видео с Youtube очень удобно смотреть параллельно с работой в других приложениях (например, лекции или трансляции).

И вот смотрел я на этот файл, смотрел, и подумал: «Раз он mp4, значит должен быть «родным» для системы… А закину-ка я его в Safari!». В Finder выбрал файл, нажал комбинацию CMD+Alt+C (скопировать абсолютный путь до файла) и вставил в адресную строку Safari — всё заработало!