Как работают 3D трансформации View
Топовая серия постов про устройство матриц CATransform3D и линейную алгебру, используемую для расчетов трансформаций.
Топовая серия постов про устройство матриц CATransform3D и линейную алгебру, используемую для расчетов трансформаций.
🔥22👏1
Советы по работе с Accessibility
Разработчик организовал себе челлендж – каждый день постить один твит про работу с Accessibility в iOS в течение года. Набралось уже 80 советов, среди которых есть много интересных идей.
- О событиях в приложении, которые происходят асинхронно, можно уведомлять через CoiceOver. По умолчанию такие уведомления прерывают друг друга. Чтобы этого не происходило, можно складывать их в очередь, передав специальный параметр в атрибутах.
- Если в результате действий пользователя меняется лэйаут, хорошей практикой будет переместить фокус VoiceOver, отправив layout changed notification.
- Если установить у вьюшки свойство isAccessibilityElement в true, то движок Accessibility перестанет учитывать ее сабвью, и все, что расположено на ней, перестанет быть доступно.
Разработчик организовал себе челлендж – каждый день постить один твит про работу с Accessibility в iOS в течение года. Набралось уже 80 советов, среди которых есть много интересных идей.
- О событиях в приложении, которые происходят асинхронно, можно уведомлять через CoiceOver. По умолчанию такие уведомления прерывают друг друга. Чтобы этого не происходило, можно складывать их в очередь, передав специальный параметр в атрибутах.
- Если в результате действий пользователя меняется лэйаут, хорошей практикой будет переместить фокус VoiceOver, отправив layout changed notification.
- Если установить у вьюшки свойство isAccessibilityElement в true, то движок Accessibility перестанет учитывать ее сабвью, и все, что расположено на ней, перестанет быть доступно.
👍22👏5💯1
Реализация градиентов на шейдерах
Первая статья из планируемого цикла разработки шейдеров на Metal. Автор сравнивает реализацию градиента на CPU и GPU с 1D и 2D текстурами.
Первая статья из планируемого цикла разработки шейдеров на Metal. Автор сравнивает реализацию градиента на CPU и GPU с 1D и 2D текстурами.
🔥40😱6👍4❤🔥3
Как использовать UIPasteControl, чтобы работать с буфером обмена
Начиная с iOS 16, приложения не могут свободно читать содержимое буфера обмена. Вместо этого у пользователя каждый раз запрашивается разрешение. Способ обойти запрос разрешения – использовать новый UIPasteControl.
Начиная с iOS 16, приложения не могут свободно читать содержимое буфера обмена. Вместо этого у пользователя каждый раз запрашивается разрешение. Способ обойти запрос разрешения – использовать новый UIPasteControl.
🤯28🔥8🌚3👍1
SwiftUI и навигация через Tab
На macOS можно переходить между полями ввода с помощью нажатия Tab. Это удобно при работе с большими формами. В статье рассказывается, как можно переопределить логику определения следующего поля для фокуса, если поведение по умолчанию вам не подходит.
На macOS можно переходить между полями ввода с помощью нажатия Tab. Это удобно при работе с большими формами. В статье рассказывается, как можно переопределить логику определения следующего поля для фокуса, если поведение по умолчанию вам не подходит.
Nil Coalescing
Adjust the direction of focus-based navigation in SwiftUI
We can customize how the user navigates through focusable views in our macOS apps with the help of the new focusSection() modifier.
🤡8👍4👎3🕊2
Sendable и @Sendable
Среди последних нововведений в Swift Concurrency появились протокол Sendable и одноименный атрибут для функций. Их задача – гарантировать типобезопасность при передачи значений в многопоточном коде. В статье разбираются детали и ограничения работы с протоколом и то, как подготовить свой код к strict concurrency checking в Swift 6.
Среди последних нововведений в Swift Concurrency появились протокол Sendable и одноименный атрибут для функций. Их задача – гарантировать типобезопасность при передачи значений в многопоточном коде. В статье разбираются детали и ограничения работы с протоколом и то, как подготовить свой код к strict concurrency checking в Swift 6.
SwiftLee
Sendable and @Sendable closures explained with code examples
The Sendable protocol and @Sendable attribute help to eliminate data races and create thread-safety in Swift Concurrency.
👍20👎3🔥1
Как устроено логирование в приложении Авито
- Точки отказа в мобильных приложениях
- Классификация типов ошибок
- Как в архитектуру приложения встроена система репортинга и логирования разных типов ошибок
- Зачем и как логировать ошибки с экранов приложения
- Примеры пользы, полученной от детального логирования
- Точки отказа в мобильных приложениях
- Классификация типов ошибок
- Как в архитектуру приложения встроена система репортинга и логирования разных типов ошибок
- Зачем и как логировать ошибки с экранов приложения
- Примеры пользы, полученной от детального логирования
🤡48👍14🤔4
Создание и поддержка фермы из 200 Mac Mini
- Каждый день Agoda гоняет 800 билдов на CI, в рамках каждого из которых проходит 23000 тестов
- Быстрый рост количества тестов сделал невыгодными сторонние сервисы
- Детали про организацию электроснабжения и охлаждения фермы
- Подходы к виртуализации
- Плюсы и минусы поддержки своей фермы
- Каждый день Agoda гоняет 800 билдов на CI, в рамках каждого из которых проходит 23000 тестов
- Быстрый рост количества тестов сделал невыгодными сторонние сервисы
- Детали про организацию электроснабжения и охлаждения фермы
- Подходы к виртуализации
- Плюсы и минусы поддержки своей фермы
🤯34🔥8👍2❤1
Разбор нового компонента SwiftUI – Gauge
- Gauge – это view, которая умеет отображать прогресс изменения какого-то значения
- У Gauge есть много стилей: accessoryCircular, accessoryCircularCapacity, accessoryLinear, accessoryLinearCapacity, defaultStyle
- В твиттер-треде показаны видео с примерами его работы и короткие сниппеты с настройкой
- Gauge – это view, которая умеет отображать прогресс изменения какого-то значения
- У Gauge есть много стилей: accessoryCircular, accessoryCircularCapacity, accessoryLinear, accessoryLinearCapacity, defaultStyle
- В твиттер-треде показаны видео с примерами его работы и короткие сниппеты с настройкой
👍33🌚12
Как работать с NSZombie не только локально
- NSZombie – это механизм, позволяющий отлавливать ошибки типа EXC_BAD_ACCESS
- Предоставляемый Apple тулинг работает только локально
- Похожую функциональность можно реализовать самостоятельно, включить на пользователях тестфлайта и получать в Crashlytics подробную информацию о крешах
- В продакшн тащить такой подход не рекомендуется
- Код доступен здесь
- NSZombie – это механизм, позволяющий отлавливать ошибки типа EXC_BAD_ACCESS
- Предоставляемый Apple тулинг работает только локально
- Похожую функциональность можно реализовать самостоятельно, включить на пользователях тестфлайта и получать в Crashlytics подробную информацию о крешах
- В продакшн тащить такой подход не рекомендуется
- Код доступен здесь
👍17
Async Composable Architecture
Pointfree выпустили 200 эпизод своего видеокурса, а вместе с этим выложили большое обновление библиотеки Composable Architecture. Основные изменения связаны с внесением в нее различных фич Swift Concurrency.
Pointfree выпустили 200 эпизод своего видеокурса, а вместе с этим выложили большое обновление библиотеки Composable Architecture. Основные изменения связаны с внесением в нее различных фич Swift Concurrency.
www.pointfree.co
Episode #200: Async Composable Architecture in Practice
This week we are releasing the biggest update to the Composable Architecture since its first release over 2 years ago, bringing more of Swift’s modern concurrency tools to the library. To celebrate we will demonstrate how these tools can massively simplify…
🔥27❤7👍7👎5❤🔥2
Новый Grid Layout в SwiftUI
- Новый вид сетки сразу же отрисовывает все дочерние элементы в отличие от LazyVGrid или LazyHGrid
- Настраивать можно как расстояния между рядами и столбцами, так и поведение внутри ячейки
- Разумно использовать этот контрол по умолчанию, и переключаться на Lazy версию только при работе с большим количеством данных
- Новый вид сетки сразу же отрисовывает все дочерние элементы в отличие от LazyVGrid или LazyHGrid
- Настраивать можно как расстояния между рядами и столбцами, так и поведение внутри ячейки
- Разумно использовать этот контрол по умолчанию, и переключаться на Lazy версию только при работе с большим количеством данных
🔥9👍3👎2
Воркшоп по архитектуре Flux
MVVM – отличная архитектура, но при использовании ее со SwiftUI возникает много проблем. 22 августа в 20:00 Ексей Пантелеев расскажет, с какими проблемами приходится сталкиваться, как их можно решить, расширив MVVM с помощью SOA и Coordinator’ов, и покажет, как можно строить архитектуру по принципам Flux.
Вебинар является частью онлайн-курса «iOS Developer. Professional» от OTUS. Партнер курса: Certiport.
MVVM – отличная архитектура, но при использовании ее со SwiftUI возникает много проблем. 22 августа в 20:00 Ексей Пантелеев расскажет, с какими проблемами приходится сталкиваться, как их можно решить, расширив MVVM с помощью SOA и Coordinator’ов, и покажет, как можно строить архитектуру по принципам Flux.
Вебинар является частью онлайн-курса «iOS Developer. Professional» от OTUS. Партнер курса: Certiport.
🤡61👍14👎4❤🔥3
Fucking Format Style
Подробная документация по FormatStyle и ParseableFormatStyle. Удобно смотреть все возможные атрибуты для перевода различных типов данных в локализованные строки.
Подробная документация по FormatStyle и ParseableFormatStyle. Удобно смотреть все возможные атрибуты для перевода различных типов данных в локализованные строки.
❤🔥26🔥1
Kintsugi – решение конфликтов в project.pbxproj
При конфликте Kintsugi анализирует изменения, сделанные в pbxproj файле, отменяет их, и делает заново.
При конфликте Kintsugi анализирует изменения, сделанные в pbxproj файле, отменяет их, и делает заново.
🤔20🌚5🤡4👎3😱3👍2🔥1
Пропозал по миграции компилятора Swift на Swift
- Важный этап в развитии любого языка – это бутстраппинг. Этот термин означает, что для того, чтобы скомпилировать новую версию компилятора, используется предыдущая версия этого же компилятора.
- Большая часть компилятора Swift написана на С++ и для ее компиляции Swift не нужен
- Исключение – несколько опциональных компонентов, которые уже реализованы на Swift. Среди них – Swift Driver, управляющий процессом компиляции, экспериментальный движок для pattern matching и некоторые SIL passes.
- Автор пропозала предлагает начать переписывать на Swift не только опциональные части компилятора
- Пост интересен в том числе как хороший инсайт в то, как сейчас организован процесс сборки компилятора
- Важный этап в развитии любого языка – это бутстраппинг. Этот термин означает, что для того, чтобы скомпилировать новую версию компилятора, используется предыдущая версия этого же компилятора.
- Большая часть компилятора Swift написана на С++ и для ее компиляции Swift не нужен
- Исключение – несколько опциональных компонентов, которые уже реализованы на Swift. Среди них – Swift Driver, управляющий процессом компиляции, экспериментальный движок для pattern matching и некоторые SIL passes.
- Автор пропозала предлагает начать переписывать на Swift не только опциональные части компилятора
- Пост интересен в том числе как хороший инсайт в то, как сейчас организован процесс сборки компилятора
👍28👎4🥰2
Allow implicit self for weak self captures, after self is unwrapped
Language Workgroup приняла пропозал, согласно которому можно больше не писать self в замыканиях с weak self после того, как self развернули. Изменения реализуют в одной из следующих версий Swift.
Вот как будет выглядеть код:
Language Workgroup приняла пропозал, согласно которому можно больше не писать self в замыканиях с weak self после того, как self развернули. Изменения реализуют в одной из следующих версий Swift.
Вот как будет выглядеть код:
button.tapHandler = { [
weak
self]
in
guard
let
self =
self
else {
return }
dismiss()
}
Swift Forums
Allow implicit `self` for `weak self` captures, after `self` is unwrapped
As a follow up from this discussion earlier this year, here's a pitch for allowing implicit self for weak self captures. This is implemented in apple/swift#40702, and the full proposal document is here. Introduction As of SE-0269, implicit self is permitted…
👍88❤🔥14👎5🤔4❤1🔥1
Типовые архитектурные паттерны переоценены
- В реальной жизни дизайн многих систем разрабатывается не так, как в книгах. Их не разрабатывают выделенные архитекторы, не документируют сложными стандартами вроде С4, не используют UML, и не пытаются привести к словарю стандартных архитектурных паттернов банды четырех
- Задача инженера – выработать максимально простую архитектуру, которая поможет решить текущую бизнес-проблему. Соответствие стандартным подходам часто влечет за собой излишнюю сложность
- Главная роль паттернов – в повышении вашей насмотренности
- Чтобы прокачаться в system design, прорабатывайте архитектуру сложных кейсов самостоятельно, запрашивайте фидбэк у коллег, сравнивайте разные варианты дизайна друг с другом, проводите ревью у других людей
- В реальной жизни дизайн многих систем разрабатывается не так, как в книгах. Их не разрабатывают выделенные архитекторы, не документируют сложными стандартами вроде С4, не используют UML, и не пытаются привести к словарю стандартных архитектурных паттернов банды четырех
- Задача инженера – выработать максимально простую архитектуру, которая поможет решить текущую бизнес-проблему. Соответствие стандартным подходам часто влечет за собой излишнюю сложность
- Главная роль паттернов – в повышении вашей насмотренности
- Чтобы прокачаться в system design, прорабатывайте архитектуру сложных кейсов самостоятельно, запрашивайте фидбэк у коллег, сравнивайте разные варианты дизайна друг с другом, проводите ревью у других людей
The Pragmatic Engineer
Software Architecture is Overrated, Clear and Simple Design is Underrated
I had my fair share in designing and building large systems. I've taken part in
rewriting Uber's distributed payment systems
[https://blog.pragmaticengineer.com/distributed-architecture-concepts-i-have-learned-while-building-payments-systems/]
, designing…
rewriting Uber's distributed payment systems
[https://blog.pragmaticengineer.com/distributed-architecture-concepts-i-have-learned-while-building-payments-systems/]
, designing…
👍40👎4🔥4🤡3❤2🤯2