Пример создания UICollectionViewCompositionalLayout
В iOS 13 Apple представила новый и очень мощный способ создания макетов для UICollectionView —
Он предоставляет декларативный способ создания богатых и сложных макетов для вашего приложения. Больше никаких сложных расчетов размеров, борьбы со вставками, размеров заголовков.
В композиционном макете используются три типа «строительных блоков»:
🔘
🔘
🔘
📖 В этой статье более детально разбираются определения и приводятся примеры создания.
@iOS Dev
В iOS 13 Apple представила новый и очень мощный способ создания макетов для UICollectionView —
UICollectionViewCompositionalLayout
. Он предоставляет декларативный способ создания богатых и сложных макетов для вашего приложения. Больше никаких сложных расчетов размеров, борьбы со вставками, размеров заголовков.
В композиционном макете используются три типа «строительных блоков»:
🔘
item
— описывает свойства фактической ячейки, которые будут отображаться.🔘
group
— это самая мощная вещь в композиционном лэйауте! Больше не нужно вычислять, какой элемент должен быть больше, меньше, полной ширины или половинной ширины. Всю эту информацию достаточно описать в группе.🔘
section
— как следует из названия, описывает секцию. Секция имеет внутри одну группу и может иметь дополнительные элементы, такие как нижние и верхние хэдеры.📖 В этой статье более детально разбираются определения и приводятся примеры создания.
@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Архитектура MVVM за 90 секунд
📖 В этой статье вы найдете все необходимое, чтобы разобраться в этой популярной архитектуре iOS-приложений.
Шесть шагов, описанных в материале, затрагивают этапы от создания
🛠 Поэкспериментировать самим можно с помощью кода.
📺 В формате короткого 🏴 видео материал доступен здесь.
@iOS Dev
📖 В этой статье вы найдете все необходимое, чтобы разобраться в этой популярной архитектуре iOS-приложений.
Шесть шагов, описанных в материале, затрагивают этапы от создания
ViewModel
до момента, когда ViewController
сможет полагаться на ViewModel
для извлечения и форматирования данных.🛠 Поэкспериментировать самим можно с помощью кода.
📺 В формате короткого 🏴 видео материал доступен здесь.
@iOS Dev
Что такое Measurement type: определение, примеры и способы его использования
Measurement type — невероятно полезный инструмент в наборе инструментов разработчика Apple.
📖 В этом материале автор размышляет о причинах для встраивания в свои проекты, в особенности, для разных стран. При этом в статье приводятся способы использования, а также объясняется, как с помощью
ℹ️ Хотя этот пост посвящен
К сожалению,
💪 Преобразование и математические вычисления с помощью
@iOS Dev
Measurement type — невероятно полезный инструмент в наборе инструментов разработчика Apple.
Это специально созданный тип для хранения, преобразования и вычисления суммы физических измерений с мощной системой локализации, построенной поверх него.
📖 В этом материале автор размышляет о причинах для встраивания в свои проекты, в особенности, для разных стран. При этом в статье приводятся способы использования, а также объясняется, как с помощью
Measurement
преобразовывать разные данные и применять локализацию.ℹ️ Хотя этот пост посвящен
Swift
, полезно знать, что в Objective-C можно использовать NSMeasurement
, и почти все, упомянутое в этом посте, доступно вам. К сожалению,
Measurement<UnitType>.FormatStyle
предназначен только для Swift, и если вы используете Objective-C, придется полагаться на NSMeasurementFormatter для локализации.Measurement
могут быть полезными, но реальная сила проявляется, когда вы получаете так много возможностей локализации, не прилагая больших усилия.@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Senior-разработчик объясняет архитектуру проекта новичкам😎
Please open Telegram to view this post
VIEW IN TELEGRAM
Как работает Bool.random() в Swift на самом деле?
Наверняка, в своих проектах каждый хоть раз использовал нечто вроде:
🤔 Но задумывались ли вы, что происходит на самом деле внутри? Иногда я смотрю на реализацию крутых вещей в ядре Swift, как например в посте про сортировку, и ищу материалы, объясняющие то или иное решение.
Так вот, в случае Bool полная реализация API будет получать необработанное значение UInt64 от генератора (он же RNG), сдвигать его вправо 17 раз и возвращать
Самое интересное в количестве, а именно, почему же 17?
Причина, по которой значение сдвигается ровно 17 раз, заключается в том, что (некоторые) слабые ГСЧ (генераторы случайных чисел) имеют лучшие свойства случайности в средних битах по сравнению с младшими/старшими битами.
Команда разработчиков Swift решила защитить нас от API, которые решили использовать эти ГСЧ вместо стандартного
ℹ️ Кстати, до пулл-реквеста, в котором реализовано это улучшение,
📖 Почитать подробнее можно в ядре свифта или в более понятном источнике. А ещё рекомендую пост про UUID.
@iOS Dev
Наверняка, в своих проектах каждый хоть раз использовал нечто вроде:
let randomInt = Int.random(in: 1..<5)
let randomFloat = Float.random(in: 1..<10)
let randomBool = Bool.random()
🤔 Но задумывались ли вы, что происходит на самом деле внутри? Иногда я смотрю на реализацию крутых вещей в ядре Swift, как например в посте про сортировку, и ищу материалы, объясняющие то или иное решение.
Так вот, в случае Bool полная реализация API будет получать необработанное значение UInt64 от генератора (он же RNG), сдвигать его вправо 17 раз и возвращать
true
, если первый бит результирующего значения равен 0.Самое интересное в количестве, а именно, почему же 17?
Причина, по которой значение сдвигается ровно 17 раз, заключается в том, что (некоторые) слабые ГСЧ (генераторы случайных чисел) имеют лучшие свойства случайности в средних битах по сравнению с младшими/старшими битами.
Команда разработчиков Swift решила защитить нас от API, которые решили использовать эти ГСЧ вместо стандартного
SystemRandomNumberGenerator
. ℹ️ Кстати, до пулл-реквеста, в котором реализовано это улучшение,
Bool.random()
просто возвращал generator.next() % 2 == 0
.📖 Почитать подробнее можно в ядре свифта или в более понятном источнике. А ещё рекомендую пост про UUID.
@iOS Dev
Как реализовать обновления в реальном времени с помощью Live Activity + Бонус
ℹ️ Live Activities будут представлены в iOS 16.1 как способ отображения актуальной информации на экране блокировки iPhone и в Dynamic Island.
📖 В этой статье автор разбирается с API с помощью создания приложения доставки, где пользователь будет получать обновления своего заказа прямо на экран блокировки своего телефона.
👩💻 Бонусом идёт модифицированный скрипт для отправки нужных пушей, взятый из документации Apple.
👨💻 Кроме этого материала, советую ознакомиться с официальной документацией, если вы планируете внедрять эту функциональность в свои приложения.
@iOS Dev
ℹ️ Live Activities будут представлены в iOS 16.1 как способ отображения актуальной информации на экране блокировки iPhone и в Dynamic Island.
📖 В этой статье автор разбирается с API с помощью создания приложения доставки, где пользователь будет получать обновления своего заказа прямо на экран блокировки своего телефона.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Создание и планирование локальных уведомлений с помощью async/await
После того как вы получите разрешение на отправку уведомлений, вам будет доступно управление уведомлениями с помощью
📖 В этом руководстве рассказывается, как создавать такие уведомления, начиная с работы над контентом и заканчивая планированием с помощью триггера, основанного на времени.
@iOS Dev
После того как вы получите разрешение на отправку уведомлений, вам будет доступно управление уведомлениями с помощью
user notification center
.📖 В этом руководстве рассказывается, как создавать такие уведомления, начиная с работы над контентом и заканчивая планированием с помощью триггера, основанного на времени.
@iOS Dev
Интерполяция строк в Swift 5
📖 Swift 5 добавил некоторые приятные улучшения для интерполяции строк, о которых многие люди могут не знать.
Как минимум, это возможность управлять интерполяцией в кастомный тип, использующий
ℹ️ Это позволит создавать такие типы, как
Бекка Ройал-Гордон предоставила несколько хороших примеров этого в SE-0228.
Как побочный эффект,
@iOS Dev
📖 Swift 5 добавил некоторые приятные улучшения для интерполяции строк, о которых многие люди могут не знать.
Как минимум, это возможность управлять интерполяцией в кастомный тип, использующий
ExpressibleByStringInterpolation
. ℹ️ Это позволит создавать такие типы, как
HTML
, и управлять новым форматированием строк OSLog
(например, log.debug("value \(x, privacy: .public)"
). Бекка Ройал-Гордон предоставила несколько хороших примеров этого в SE-0228.
Как побочный эффект,
String
и Substring
теперь используют DefaultStringInterpolation
, что дает нам возможность для настройки поведения интерполяции.@iOS Dev
Как подружить фичу Autoplay и tvOS?
Autoplay — это когда по завершении просмотра одного фильма пользователю предлагается посмотреть похожий контент, рекомендованный системой.
О нюансах реализации этой фичи на tvOS рассказала Валерия Рублевская, iOS-разработчик на проекте онлайн-кинотеатра KION от МТС.
Прочитать можно здесь.
Autoplay — это когда по завершении просмотра одного фильма пользователю предлагается посмотреть похожий контент, рекомендованный системой.
О нюансах реализации этой фичи на tvOS рассказала Валерия Рублевская, iOS-разработчик на проекте онлайн-кинотеатра KION от МТС.
Прочитать можно здесь.
Хабр
Как мы улучшали функциональность онлайн-кинотеатра на tvOS
Всем привет, меня зовут Валерия Рублевская, я iOS-разработчик на проекте онлайн-кинотеатра KION в МТС Digital . Это третья часть рассказа о фиче Autoplay фильмов и сегодня мы поговорим о нюансах ее...
Использование Apple Swift и SwiftUI в iOS 16
📖 Большое исследование от Alexandre Colucci, которое стало уже традиционным. Как и в прошлые годы, автор постарался ответить на следующие вопросы:
🔘 Сколько бинарников в iOS 16?
🔘 Какие языки программирования используются для разработки этих приложений?
🔘 Сколько приложений написано на Swift?
🔘 Каков процент приложений, использующих SwiftUI, по сравнению с UIKit?
В материале автор рассказывает о методологии, об эволюции языков программирования и сравнивает
Всё это с помощью красивых графиков, а для любителей статистики — приводится массив данных по каждой из iOS.
Краткий вывод
Swift продолжает свое экспоненциальное восхождение и в этом году он опередил C++. Кроме этого, SwiftUI чаще задействуется и в Apple: количество двоичных файлов, использующих SwiftUI, удвоилось между iOS 15 и iOS 16.
@iOS Dev
📖 Большое исследование от Alexandre Colucci, которое стало уже традиционным. Как и в прошлые годы, автор постарался ответить на следующие вопросы:
В материале автор рассказывает о методологии, об эволюции языков программирования и сравнивает
UIKit
со SwiftUI
непосредственно в самих приложениях Apple.Всё это с помощью красивых графиков, а для любителей статистики — приводится массив данных по каждой из iOS.
Краткий вывод
Swift продолжает свое экспоненциальное восхождение и в этом году он опередил C++. Кроме этого, SwiftUI чаще задействуется и в Apple: количество двоичных файлов, использующих SwiftUI, удвоилось между iOS 15 и iOS 16.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Вы только посмотрите, разве это не самая милая реализация возможностей Dynamic Island?
В приложении Apollo можно кормить питомцев, играть с ними в игры, укреплять дружбу и не только.
📖 Материалы, которые вам помогут создать свой собственный остров: раз и два.
@iOS Dev
В приложении Apollo можно кормить питомцев, играть с ними в игры, укреплять дружбу и не только.
📖 Материалы, которые вам помогут создать свой собственный остров: раз и два.
@iOS Dev
Учебник по кривым Безье — бесплатный ресурс (а по факту книга на github) с огромным руководством по работе с кривыми Безье
📖 Это электронная книга, посвященная как математическим, так и программным аспектам кривых Безье, охватывающая широкий круг тем, связанных с рисованием и работой с этой кривой, которая, кажется, появляется повсюду, от путей Photoshop до функций смягчения CSS и контура шрифта.
🕔 Я, конечно, ни на что не намекаю, но материал может пригодиться и когда-нибудь в будущем.
📖 В этом материале рассматриваются 45 глав, которые охватывают если не всё, то почти всё, связанное с этой темой.
Поэтому, если вас не пугает большое количество формул и расчётов, то источник вполне можно сохранить себе.
P.S. От себя бы добавил желающим поучаствовать два совета, которыми вы легко можете пренебречь:
1️⃣ Отталкивайтесь в любом конкурсе от базы, а именно, от минимальных требований.
2️⃣ Планируйте своё время. Не только в конкурсе, а и в рабочих задачах. И помните про декомпозицию.
Не факт, что я сам буду участвовать в этот раз, но всем, кто попробует свои силы —⭐️ удачи!
@iOS Dev
📖 Это электронная книга, посвященная как математическим, так и программным аспектам кривых Безье, охватывающая широкий круг тем, связанных с рисованием и работой с этой кривой, которая, кажется, появляется повсюду, от путей Photoshop до функций смягчения CSS и контура шрифта.
🕔 Я, конечно, ни на что не намекаю, но материал может пригодиться и когда-нибудь в будущем.
📖 В этом материале рассматриваются 45 глав, которые охватывают если не всё, то почти всё, связанное с этой темой.
Поэтому, если вас не пугает большое количество формул и расчётов, то источник вполне можно сохранить себе.
P.S. От себя бы добавил желающим поучаствовать два совета, которыми вы легко можете пренебречь:
1️⃣ Отталкивайтесь в любом конкурсе от базы, а именно, от минимальных требований.
2️⃣ Планируйте своё время. Не только в конкурсе, а и в рабочих задачах. И помните про декомпозицию.
Не факт, что я сам буду участвовать в этот раз, но всем, кто попробует свои силы —
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Код Воробья для iOS разработчиков
В Xcode 14 добавили экспорт локализации пакетов. Подробнее в туториале по локализации.
Это новый туториал на сайте, мы сделали большой ультимативный гайд по локализации. Разобрали основы, экспорт и импорт, как локализовать SPM-пакеты, плюрализацию, картинки, плагины для авторгенерации.
В конце туториала узнаете почему для некоторых российский рубль показывается как ₽, а для некоторых RUB.
Это новый туториал на сайте, мы сделали большой ультимативный гайд по локализации. Разобрали основы, экспорт и импорт, как локализовать SPM-пакеты, плюрализацию, картинки, плагины для авторгенерации.
В конце туториала узнаете почему для некоторых российский рубль показывается как ₽, а для некоторых RUB.
Vision Framework для iOS: обнаружение контуров
💡 Творческий подход к доступным вам инструментам может существенно повлиять на результат.
Различные наборы алгоритмов изменяют то, как выглядит и воспринимается окончательный результат.
Вы даже можете использовать алгоритмы компьютерного зрения для создания интересных фильтров и эффектов для изображений и фотографий.
Например, если вы обнаружили все контуры на изображении, у вас появится классный материал, чтобы реализовать отлично выглядящий рисунок.
📖 В этом руководстве вы узнаете, как использовать фреймворк Vision для следующих этапов:
1️⃣ Создание запросов для обнаружения контуров.
2️⃣ Настройка параметров для получения разных контуров.
3️⃣ Упрощение контуров для создания художественных эффектов.
@iOS Dev
💡 Творческий подход к доступным вам инструментам может существенно повлиять на результат.
Различные наборы алгоритмов изменяют то, как выглядит и воспринимается окончательный результат.
Вы даже можете использовать алгоритмы компьютерного зрения для создания интересных фильтров и эффектов для изображений и фотографий.
Например, если вы обнаружили все контуры на изображении, у вас появится классный материал, чтобы реализовать отлично выглядящий рисунок.
📖 В этом руководстве вы узнаете, как использовать фреймворк Vision для следующих этапов:
1️⃣ Создание запросов для обнаружения контуров.
2️⃣ Настройка параметров для получения разных контуров.
3️⃣ Упрощение контуров для создания художественных эффектов.
@iOS Dev
OptionSet в Swift: определение, примеры и при чём тут побитовые операторы?
Недавно я писал пост про «базу» и то, что на самом деле мы гораздо чаще, чем нам кажется, встречаемся с важными алгоритмическими понятиями.
📖 В этом материале рассказывается о том, что создать собственный OptionSet не так уж и сложно.
Его можно использовать для большого количества логических значений.
Хотя вы можете инициализировать его литералом массива, на самом деле он больше похож на Set, чем на массив.
ℹ️ Фактически,
В статье рассказывается об этой и остальных особенностях, приводится пример создания и рассматриваются возможности работы с
@iOS Dev
Недавно я писал пост про «базу» и то, что на самом деле мы гораздо чаще, чем нам кажется, встречаемся с важными алгоритмическими понятиями.
📖 В этом материале рассказывается о том, что создать собственный OptionSet не так уж и сложно.
Его можно использовать для большого количества логических значений.
Хотя вы можете инициализировать его литералом массива, на самом деле он больше похож на Set, чем на массив.
ℹ️ Фактически,
OptionSet
наследует все SetAlgebra
, которые вы можете применять к сетам, что означает, что OptionSet имеет такие методы, как intersection
, union
, contains
и несколько других методов, которые вы могли использовать в Set.В статье рассказывается об этой и остальных особенностях, приводится пример создания и рассматриваются возможности работы с
OptionSet
.@iOS Dev
Простой доступ к данным симулятора
🔎 При разработке для iOS часто бывает полезно перейти к файлам, которые вы создаете в симуляторе.
Местонахождение файлов на диске менялось годами, но одно оставалось неизменным — неудобно определять местонахождение файлов.
Трудности с поиском файлов становятся еще более очевидными при работе в команде.
ℹ️ В этом решении идея состоит в том, чтобы проверить таргет, а затем добавить символическую ссылку на ваш рабочий стол.
Проверка переменных среды, доступных при работе в симуляторе, показывает, что есть вся необходимая информация, чтобы это произошло.
😎 Теперь, каждый раз при запуске симулятора, на рабочем столе вашего Mac будет создаваться новая символическая ссылка.
@iOS Dev
🔎 При разработке для iOS часто бывает полезно перейти к файлам, которые вы создаете в симуляторе.
Местонахождение файлов на диске менялось годами, но одно оставалось неизменным — неудобно определять местонахождение файлов.
Трудности с поиском файлов становятся еще более очевидными при работе в команде.
ℹ️ В этом решении идея состоит в том, чтобы проверить таргет, а затем добавить символическую ссылку на ваш рабочий стол.
Проверка переменных среды, доступных при работе в симуляторе, показывает, что есть вся необходимая информация, чтобы это произошло.
😎 Теперь, каждый раз при запуске симулятора, на рабочем столе вашего Mac будет создаваться новая символическая ссылка.
@iOS Dev
Несмотря на то, что
UIStackView
значительно упрощает лэйаут, он все равно может стать довольно сложным и несколько запутанным. Существует четыре основных свойства
UIStackView
:1️⃣
axis
2️⃣
distribution
3️⃣
alignment
4️⃣
spacing
Первый и последний относительно просты. Мы используем axis, чтобы определить ориентацию представления стека, которая может быть вертикальной или горизонтальной.
Как насчет оставшихся двух:
alignment
и spacing
? Хотя
UIStackView
стал настолько популярным и широко используется во многих приложениях, многие могут не понимать его полностью и использовать неправильно. 📖 И как раз о причинах сложностей и свойствах
UIStackView
рассказывается в этом материале. @iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Реализация двунаправленной UICollectionView с использованием orthogonalScrollingBehavior
ℹ️ До iOS 13, если вы хотели реализовать вертикальную UICollectionView с разделами с горизонтальной прокруткой, требовалось встроить scroll view внутрь ячейки, передать модель, обработать тачи, прикрутить делегирование и сложную логику.
С
Всё благодаря
📖 В этом материале рассказывает о своём опыте использования и приводит примеры.
👩💻 Код доступен на github.
ℹ️ До iOS 13, если вы хотели реализовать вертикальную UICollectionView с разделами с горизонтальной прокруткой, требовалось встроить scroll view внутрь ячейки, передать модель, обработать тачи, прикрутить делегирование и сложную логику.
С
UICollectionViewCompositionalLayout
все эти проблемы исчезают. Всё благодаря
orthogonalScrollingBehavior
, которую предоставила нам Apple.📖 В этом материале рассказывает о своём опыте использования и приводит примеры.
Please open Telegram to view this post
VIEW IN TELEGRAM
Какими должны быть outlets, weak или всё-таки strong?
❔ Должны ли
Эти вопросы возникают довольно часто. И чтобы понять, что к чему, нам нужно знать, какие из объектов ссылаются на другие. А подсчет ссылок должен в этом помочь.
📖 В этом материале автор даёт ответ на этот вопрос, приводит аргументы и объясняет свои выводы.
@iOS Dev
outlets
объявляться слабыми или сильными? Что произойдёт, если использовать weak
? Какие здесь подводные камни?Эти вопросы возникают довольно часто. И чтобы понять, что к чему, нам нужно знать, какие из объектов ссылаются на другие. А подсчет ссылок должен в этом помочь.
📖 В этом материале автор даёт ответ на этот вопрос, приводит аргументы и объясняет свои выводы.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Создание меню отладки в Swift с помощью UIContextMenuInteraction
Меню отладки в iOS — очень эффективный способ повысить продуктивность рабочего дня разработчика.
🔎 Если вы обнаружите, что выполняете одни и те же задачи отладки снова и снова (я вам уже говорил, что такое безумие), такие как вывод ответов серверной части, переход к определенным экранам или копирование айдишников пользователей, было бы неплохо иметь в своем приложении специальные меню разработчика, которые делали бы это автоматически.
Для этого может пригодиться
Он работает аналогично
А начиная с iOS 14, мы даже можем добавить к нему нужные нам асинхронные действия с помощью
📖 В этом материале рассказывается о способе создания абстракции, которая реализует меню отладки для нужных нам вьюх в тестовых сборках.
@iOS Dev
Меню отладки в iOS — очень эффективный способ повысить продуктивность рабочего дня разработчика.
Для этого может пригодиться
UIContextMenuInteraction
— API контекстного меню. Он работает аналогично
UIAlertController
, но на него приятнее смотреть и, что самое важное, гораздо проще реализовать! А начиная с iOS 14, мы даже можем добавить к нему нужные нам асинхронные действия с помощью
UIDeferredMenuElement
.📖 В этом материале рассказывается о способе создания абстракции, которая реализует меню отладки для нужных нам вьюх в тестовых сборках.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM