Простой доступ к данным симулятора
🔎 При разработке для 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
Grand Central Dispatch: от определения к низкоуровневым примитивам
ℹ️ Вместо ручного создания потоков и их последующего контроля мы можем использовать абстрактные очереди и возложить на них всю ответственность по управлению потоками.
В серии статей ниже Alex Shchukin рассматривает основные понятия, как, например, очереди, как с ними работать, иссследует
⭐️ Плюс статей в примерах, с помощью которых реализуются некоторые основные подходы, которые можно использовать в реальных приложениях.
А для самых любопытных Алекс расскажет, как реализовать примитивы GCD самостоятельно.
Материалы доступны здесь:
1️⃣ GCD: Очереди и методы.
2️⃣ DispatchWorkItem и Quality of Service (тот самый QoS).
3️⃣ DispatchGroup и concurrentPerform.
4️⃣ Синхронизация: семафоры, барьеры (и не только).
5️⃣ DispatchSource и Target Queue Hierarchy.
👨💻 Примитивы GCD в деталях — в этой статье автор использует низкоуровневые примитивы, чтобы разобраться, как на самом деле работает GCD.
@iOS Dev
ℹ️ Вместо ручного создания потоков и их последующего контроля мы можем использовать абстрактные очереди и возложить на них всю ответственность по управлению потоками.
В серии статей ниже Alex Shchukin рассматривает основные понятия, как, например, очереди, как с ними работать, иссследует
dispatch source
и затрагивает DispatchIO
(который не является супер популярным инструментом). А для самых любопытных Алекс расскажет, как реализовать примитивы GCD самостоятельно.
Материалы доступны здесь:
1️⃣ GCD: Очереди и методы.
2️⃣ DispatchWorkItem и Quality of Service (тот самый QoS).
3️⃣ DispatchGroup и concurrentPerform.
4️⃣ Синхронизация: семафоры, барьеры (и не только).
5️⃣ DispatchSource и Target Queue Hierarchy.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Протоколы ошибок, о которых вы могли не знать: LocalizedError, RecoverableError, CustomNSError
Несмотря на то, насколько мы все знакомы с
Вы можете сказать, что эти протоколы действительно малоизвестны, и есть большая вероятность, что вы о них не слышали:
🔘
🔘
🔘
📖 В этом объёмном материале автор разбирает на примерах, что и когда лучше использовать.
@iOS Dev
Несмотря на то, насколько мы все знакомы с
Error
, на удивление немногие из нас могут быть знакомы с другими протоколами ошибок, появившимися в SE-0112. Например, когда вы в последний раз сталкивались с LocalizedError
в дикой природе? А что насчет RecoverableError
? Вы можете сказать, что эти протоколы действительно малоизвестны, и есть большая вероятность, что вы о них не слышали:
🔘
LocalizedError
. Специализированная ошибка, предоставляющая локализованные сообщения с описанием ошибки и причиной ее возникновения.🔘
RecoverableError
. Специальная ошибка, которую можно исправить, предоставив пользователю несколько возможных вариантов восстановления.🔘
CustomNSError
. Специализированная ошибка, предоставляющая домен, код ошибки и user-info dictionary.📖 В этом объёмном материале автор разбирает на примерах, что и когда лучше использовать.
@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Довольно любопытное решение для оптимизации скролла, как верно заметил Иван в этом посте, при этом реализовано оно с помощью двуслойных картинок.
ℹ️ Кстати, в этом канале периодически выходят крутые разборы для, казалось бы, стандартных приложений.
Полезно посмотреть на то, как решают типовые проблемы инженеры яблочной компании, и как они, например:
1️⃣ В системном калькуляторе, сетку с кнопками расставили с помощью фреймов.
2️⃣ А вот тут можно прочесть про то, как устроено приложение App Store.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Рефакторинг вашего кода на Swift: лучшие практики и советы для достижения успеха
ℹ️ Рефакторинг кода — это часть пути к созданию надежных приложений.
Неважно, опытный вы или нет: каждый разработчик рефакторит свой код, чтобы улучшить его качество или читабельность.
Рефакторинг может быть достаточно маленьким, чтобы вы делали его неосознанно, в то время как большие рефакторы могут стать пугающими *.
* в один своих таких рефакторов я переписывал раздел чата (кто работал с любыми чатами меня поймёт), полностью на Texture (он же AsyncDisplayKit), и если не юзать декомпозицию задач , можно было бы говорить «повезло, повезло».
📖 Автор этой статьи делится своими мыслями, которые позволяют контролировать результат рефактора и не дают возможности ухудшить код.
В этом процессе он выделил несколько основных этапов:
🔘 Определение цели.
🔘 Создание уверенности в рефакторинге. Наши товарищи здесь это, по возможности, модульные тесты и конечно же, GIT.
🔘 Маленькие шаги к финальной цели.
🔘 Сведение масштаба к минимуму. Возможно, самый важный в психологическом плане пункт, и имеющий решающее значение на продолжительном отрезке.
Не стоит пренебрегать помощью Xcode в рефакторинге.
Конечно, вы не всегда можете предотвратить повторный рефакторинг, но вы можете вырасти как профессионал, постаравшись предотвратить свои прошлые ошибки.
@iOS Dev
ℹ️ Рефакторинг кода — это часть пути к созданию надежных приложений.
Неважно, опытный вы или нет: каждый разработчик рефакторит свой код, чтобы улучшить его качество или читабельность.
Рефакторинг может быть достаточно маленьким, чтобы вы делали его неосознанно, в то время как большие рефакторы могут стать пугающими *.
📖 Автор этой статьи делится своими мыслями, которые позволяют контролировать результат рефактора и не дают возможности ухудшить код.
В этом процессе он выделил несколько основных этапов:
Не стоит пренебрегать помощью Xcode в рефакторинге.
Конечно, вы не всегда можете предотвратить повторный рефакторинг, но вы можете вырасти как профессионал, постаравшись предотвратить свои прошлые ошибки.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Заполнение столбцов градиентом с использованием Swift Charts
🆕 С новыми
Фреймворк также предоставляет множество вариантов настройки, чтобы наши диаграммы по-настоящему выделялись.
📖 В этом посте описано, как построить диаграмму для визуализации среднесуточной температуры для каждого месяца года.
Кроме этого, используется линейный градиент, чтобы подчеркнуть холодную и теплую температуру.
Важным моментом является то, что градиент растягивается сверху вниз на всю область графика, а не заполняет каждый столбец по отдельности для достижения желаемого эффекта.
@iOS Dev
🆕 С новыми
Swift Charts
очень легко создавать простые диаграммы для визуализации данных в наших приложениях. Фреймворк также предоставляет множество вариантов настройки, чтобы наши диаграммы по-настоящему выделялись.
📖 В этом посте описано, как построить диаграмму для визуализации среднесуточной температуры для каждого месяца года.
Кроме этого, используется линейный градиент, чтобы подчеркнуть холодную и теплую температуру.
Важным моментом является то, что градиент растягивается сверху вниз на всю область графика, а не заполняет каждый столбец по отдельности для достижения желаемого эффекта.
@iOS Dev
Полегче, посложнее
Недавно в одном чате увидел такой вопрос, и вспомнил, что раньше и у самого были некоторые похожие задачи. Попробовал структурировать способы, и покопался в разных источниках. Что вышло в итоге, вы можете увидеть в этом посте.
Внимание, способы содержат как довольно очевидные решения, так и те, которые можно назвать безумными.
🔘 App Groups, пожалуй, самое очевидное из списка, и содержащее свой принцип в названии.
🔘
UIActivityViewController
— возможно и не первое, что приходит на ум, но существующее решение. Поддерживается с iOS 6.0+ и реализуется с помощью application:openURL:sourceApplication:annotation:
.🔘 Custom URL Schemes.
Чтобы включить схему URL-адресов в нашем приложении, мы должны добавить пользовательскую схему URL-адресов на вкладку информации. Откройте, например, Safari и введите [URL_scheme]://параметр, чтобы открыть ваше приложение.
🔘 Share Extension. iOS 8.0+. Это тип расширений, как, например Today, Action, Custom Keyboard и так далее.
Позволяет хранить данные в общей группе, к которой могут получить доступ другие приложения, входящие в набор приложений.
Все приложения, которые совместно используют доступ к связке ключей, должны использовать один и тот же префикс айдишника приложения.
🔘 Shared Keychain Access. iOS 3.0+.
Связку ключей можно использовать в нескольких приложениях iOS, если они опубликованы одним и тем же разработчиком и при определенных условиях.
🔘 Custom Pasteboards. iOS 3.0+. Другой объект в том же или другом приложении считывает данные из pasteboard и представляет их пользователю в новом месте; обычно это происходит, когда пользователь запрашивает операцию вставки.
В этом твиттер-треде разработчик делится своим опытом использования этого решения.
🔘 Darwin Notification Center (в этой статье есть и пример использования, и даже код).
@iOS Dev — шарим данные
Please open Telegram to view this post
VIEW IN TELEGRAM
Архитектура приложения и композиция объектов в Swift
Композиция объектов — это основная концепция объектно-ориентированного программирования.
Объекты могут содержать другие объекты, иногда создавая сложные иерархии.
📖 В этой статье автор рассказывает, как спроектировать такую архитектуру.
На реальном примере вы увидите, что работать со сложной иерархией просто, а объекты и иерархии можно использовать повторно.
@iOS Dev
Композиция объектов — это основная концепция объектно-ориентированного программирования.
Объекты могут содержать другие объекты, иногда создавая сложные иерархии.
📖 В этой статье автор рассказывает, как спроектировать такую архитектуру.
На реальном примере вы увидите, что работать со сложной иерархией просто, а объекты и иерархии можно использовать повторно.
@iOS Dev
Apple Security Bounty Program: поиск уязвимостей за вознаграждение
⌨️ Apple обновила раздел, посвященный поиску проблем в системе.
Выплаты вознаграждения Apple Security Bounty производятся по собственному усмотрению Apple и зависят от типа проблемы, достигнутого уровня доступа или выполнения, а также качества отчета.
Качественный отчет об исследовании имеет решающее значение для того, чтобы помочь нам быстро подтвердить и решить проблему, а также помочь вам получить вознаграждение Apple Security Bounty.
🔘 Например, сетевая атака может принести от $ 5 000 до $ 150 000.
Пример: щелкнув ссылку в сообщении iOS Mail, вы можете загрузить удаленный контент, когда этот параметр отключен.
🔘 А в случае, если вы знаете способ, как обойти режим блокировки и определённых уровней защиты, вы сможете получить вплоть до $ 2 000 000.
📖 Подробнее о категориях написано здесь (любопытно узнать, чего Apple боится больше всего).
@iOS Dev
Выплаты вознаграждения Apple Security Bounty производятся по собственному усмотрению Apple и зависят от типа проблемы, достигнутого уровня доступа или выполнения, а также качества отчета.
Качественный отчет об исследовании имеет решающее значение для того, чтобы помочь нам быстро подтвердить и решить проблему, а также помочь вам получить вознаграждение Apple Security Bounty.
🔘 Например, сетевая атака может принести от $ 5 000 до $ 150 000.
Пример: щелкнув ссылку в сообщении iOS Mail, вы можете загрузить удаленный контент, когда этот параметр отключен.
🔘 А в случае, если вы знаете способ, как обойти режим блокировки и определённых уровней защиты, вы сможете получить вплоть до $ 2 000 000.
📖 Подробнее о категориях написано здесь (любопытно узнать, чего Apple боится больше всего).
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Разбор различных политик кэширования при работе с URLRequest в Swift
Когда дело доходит до связи с сервером в iOS, система предлагает различные стратегии кэширования для повышения производительности и снижения сетевого трафика.
В зависимости от выбранной политики поведение может и правила управления контентом изменяются.
📖 В этой статье описано немного больше деталей, чем в доке эпла, и рассказывается, какую из политик лучше использовать в определённых условиях.
@iOS Dev
Когда дело доходит до связи с сервером в iOS, система предлагает различные стратегии кэширования для повышения производительности и снижения сетевого трафика.
В зависимости от выбранной политики поведение может и правила управления контентом изменяются.
📖 В этой статье описано немного больше деталей, чем в доке эпла, и рассказывается, какую из политик лучше использовать в определённых условиях.
@iOS Dev
Практический опыт работы с UICollectionView: создание приложения для просмотра фотографий с помощью Flickr API
Вы не ограничены только стэком или гридом, поскольку UICollectionView настраиваемы. Вы можете использовать их для создания круговых макетов, макетов в стиле cover-flow, макетов в стиле новостей и почти всего, что только можно придумать!
📖 В этом материале вы получите практический опыт работы с
😂 Добавлять свои хэдеры к
😂 Легко перемещать ячейки путем их перетаскивания.
😂 Реализовывать выделение одной ячейки для показа вьюхи с деталями.
😂 Реализовывать выделение нескольких ячеек.
@iOS Dev
UICollectionView
упрощает добавление кастомных лэйаутов и переходов между ними, такими, как в Photos.Вы не ограничены только стэком или гридом, поскольку UICollectionView настраиваемы. Вы можете использовать их для создания круговых макетов, макетов в стиле cover-flow, макетов в стиле новостей и почти всего, что только можно придумать!
📖 В этом материале вы получите практический опыт работы с
UICollectionView
, создав приложение для просмотра фотографий на основе сетки. Попутно вы узнаете, как:UICollectionView
.@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Как добавить маску для изображения в виде многоугольника?
Мы все часто используем свойство
⭐️ Но что делать, если дизайнер хочет чего-то большего, например, звезду или многоугольник?
📖 Этот пример подскажет, как использовать
@iOS Dev
Мы все часто используем свойство
cornerRadius
в CALayer, чтобы сделать наш UIImageView
закруглённым в соответствии с дизайном. 📖 Этот пример подскажет, как использовать
UIBezierPath
для создания динамического многоугольника, который будет маской для UIImageView
, как в примере на картинке.@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Как изменить стиль отступов простым способом?
Для этого можно воспользоваться комбинацией
😎 А затем если нужно, уже настраивайте отступы или же используйте Enter по вашему вкусу.
#xcode #shortcuts
@iOS Dev
Для этого можно воспользоваться комбинацией
Ctrl+Shift+«Клик мышкой»
для создания мультикурсора.#xcode #shortcuts
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Apple Wallet: поддерживаемые типы штрих-кодов и обходные пути
К сожалению, Apple Wallet поддерживает только ограниченный набор типов штрих-кодов.
Конечно, поддержка более современных 2D-штрих-кодов лучше, но ограничения Apple ведут к сложностям.
📖 В этом материале автор делится найденной информацией об Apple Wallet и о том, почему программы членства/лояльности могут не предлагать добавить цифровую карту в Apple Wallet.
@iOS Dev
К сожалению, Apple Wallet поддерживает только ограниченный набор типов штрих-кодов.
Конечно, поддержка более современных 2D-штрих-кодов лучше, но ограничения Apple ведут к сложностям.
📖 В этом материале автор делится найденной информацией об Apple Wallet и о том, почему программы членства/лояльности могут не предлагать добавить цифровую карту в Apple Wallet.
@iOS Dev
Бесконечный скролл в iOS приложении: UITableView + REST API
🟡 Бесконечная прокрутка позволяет пользователям непрерывно загружать контент, устраняя необходимость в нумерации страниц.
Приложение загружает некоторые начальные данные, а затем добавляет остальную информацию, когда пользователь достигает нижней части видимого контента.
📖 В этом руководстве вы узнаете, как добавить бесконечную прокрутку в приложение iOS, которое извлекает данные из REST API.
Кстати, ещё вы познакомитесь с
@iOS Dev
Приложение загружает некоторые начальные данные, а затем добавляет остальную информацию, когда пользователь достигает нижней части видимого контента.
📖 В этом руководстве вы узнаете, как добавить бесконечную прокрутку в приложение iOS, которое извлекает данные из REST API.
Кстати, ещё вы познакомитесь с
Prefetching API
. Это адаптивная технология, которая выполняет оптимизацию, направленную на улучшение производительности прокрутки.@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Те, кто давно читают это канал, в курсе, что иногда я пишу о повседневных вещах, названия и предназначение которых не всегда очевидны. Привет камню из Хаблингбо в Швеции!
Сегодня пятница, и поэтому позволю себе в двух предложениях рассказать, почему наша среда разработки называется Xcode, а не iCode или iBuilder (хотя последнее не так далеко от правды).
🕔 Xcode начинал свою жизнь как связка двух приложений: Project Builder и Interface Builder.
Эти инструменты были написаны для NeXT Computer, Inc. Стива Джобса для их операционной системы NeXTSTEP.
После покупки Apple NeXT, компания начала превращать NeXTSTEP в OS X, они также начали адаптировать Project Builder и Interface Builder к своей новой операционной системе.
Первоначально эти два инструмента сохранили свои старые названия, но в OS X Panther (10.3) Apple заменила Project Builder переработанной версией под названием Xcode.
В нескольких версиях Xcode продолжал поставляться вместе с Interface Builder, но связь между этими двумя инструментами всегда была сложной, поэтому в Xcode 4 (выпущенном между 10.6 и 10.7) они наконец объединили Interface Builder с Xcode.
Точно так же, как происхождение OS X как NeXTSTEP выдается префиксами «NS» во многих API, так и происхождение Xcode как Interface Builder и Project Builder выдается аббревиатурами в приложении. «IB» в «IBOutlet» и «IBAction» является аббревиатурой для «
Interface Builder
», а основной файл информации о проекте в пакете xcodeproj имеет расширение «pbxproj
» для «Project Builder X Project».@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Как синхронизировать код и отрисовку с помощью CADisplayLink?
Многие новички считают, что
Логика довольно очевидна: обновляйте приложение каждые 60 секунд, и отрисовка будет плавной. Вот только...
🍽 Проблема в том, что Timer не обеспечивает точного срабатывания и может смещаться раньше или позже запрошенных обновлений, а также не знает о перерисовке экрана и поэтому может с радостью сработать через 10 мс после того, как только что произошла перерисовка экрана.
Обычно это 60 кадров в секунду, но на некоторых более новых устройствах это 120 кадров в секунду.
Кстати!
Ваше приложение может отключить уведомления, задав для параметра
Кроме того, если ваше приложение не может предоставлять кадры за то время, которое предоставляет система, вы можете выбрать более низкую частоту кадров.
🧐 Приложение с более медленной, но постоянной частотой кадров кажется пользователю более плавным, чем приложение, которое пропускает кадры.
📖 Больше инфы: в доке эпла, или вот в этих примерах — раз, два.
@iOS Dev
Многие новички считают, что
Timer
— это отличный (и единственный) способ управлять запущенными приложениями или играми, чтобы код выполнялся каждый раз, когда экран перерисовывается. Логика довольно очевидна: обновляйте приложение каждые 60 секунд, и отрисовка будет плавной. Вот только...
CADisplayLink
— это особый вариант таймера, который позволяет вашим приложениям запускать код каждый раз сразу после обновления экрана. Обычно это 60 кадров в секунду, но на некоторых более новых устройствах это 120 кадров в секунду.
Кстати!
CADisplayLink
имеет два полезных свойства: preferredFramesPerSecond
и isPaused
. Ваше приложение может отключить уведомления, задав для параметра
isPaused
значение true
. Кроме того, если ваше приложение не может предоставлять кадры за то время, которое предоставляет система, вы можете выбрать более низкую частоту кадров.
📖 Больше инфы: в доке эпла, или вот в этих примерах — раз, два.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM