Я всё-таки принял участие в конкурсе Telegram, но к сожалению, остался за чертой призёров. Ниже мои мысли по поводу конкурса.
Часть первая или что сделано
Реализовал расчёт контрольных точек в фоновом режиме для плавных скруглений и собственно расчёта скорости (ширины линии).
Собственный colorpicker (с цветами, кастомными слайдерами и так далее). Плюс магнифаер (когда увеличиваем объект под пальцем, условно, и выбираем оттуда цвет).
Карандаш сделан с помощью текстуры и cashapelayer, по факту это маска, которой происходит отрисовка.
Есть размытие, при этом не смешное для последнего слоя, а для всех в стэке. И очистка тоже.
Реализовал текстовый редактор с помощью catextlayer и кучи сложных моментов (как мне показалось). Типа отрисовка переходов между строками и скруглений (layoutmanager и кто с ним работал, поймёт о чём речь).
Адски страдал над анимацией карандашей и таймингов (ну чтобы они все нормально скрывались и увеличивался выбранный). Ах да, там же ещё ширина выбранного инструмента (толщина)... Это дополнительный элемент на объекте карандаша, ну и очень много всяких мелочей чисто по анимациям.
Undo manager можно было пилить с помощью системного, но я бы по времени не уложился. Поэтому по факту добавляется/удаляется последний слой (и всё на слоях).
Запилил сохранение изменений и с видео тоже. Думаю, жюри даже не посмотрело (но кто знает).
Ну и множество всего, кроме этого.
Часть вторая, что сказали жюри
Конкурсное задание не выполнено, работа над приложением не окончена.
Приложение не соответствует минимальным требованиям, предусмотренным условиями конкурсного задания.
Текущая реализация приложения не обеспечивает пользователю возможность отрисовки высококачественной, плавной, четкой линии – при отрисовке линия появляется с задержкой, рывком.
Часть третья, что думаю я
Работ было очень много, срезали, если линия не рисуется мгновенно.
Финал.
Конечно, я немного разочарован таким итогом. Но в целом опыта у меня прибавилось, и когда-нибудь, надеюсь, мне всё это пригодится.
Часть первая или что сделано
Реализовал расчёт контрольных точек в фоновом режиме для плавных скруглений и собственно расчёта скорости (ширины линии).
Собственный colorpicker (с цветами, кастомными слайдерами и так далее). Плюс магнифаер (когда увеличиваем объект под пальцем, условно, и выбираем оттуда цвет).
Карандаш сделан с помощью текстуры и cashapelayer, по факту это маска, которой происходит отрисовка.
Есть размытие, при этом не смешное для последнего слоя, а для всех в стэке. И очистка тоже.
Реализовал текстовый редактор с помощью catextlayer и кучи сложных моментов (как мне показалось). Типа отрисовка переходов между строками и скруглений (layoutmanager и кто с ним работал, поймёт о чём речь).
Адски страдал над анимацией карандашей и таймингов (ну чтобы они все нормально скрывались и увеличивался выбранный). Ах да, там же ещё ширина выбранного инструмента (толщина)... Это дополнительный элемент на объекте карандаша, ну и очень много всяких мелочей чисто по анимациям.
Undo manager можно было пилить с помощью системного, но я бы по времени не уложился. Поэтому по факту добавляется/удаляется последний слой (и всё на слоях).
Запилил сохранение изменений и с видео тоже. Думаю, жюри даже не посмотрело (но кто знает).
Ну и множество всего, кроме этого.
Часть вторая, что сказали жюри
Конкурсное задание не выполнено, работа над приложением не окончена.
Приложение не соответствует минимальным требованиям, предусмотренным условиями конкурсного задания.
Текущая реализация приложения не обеспечивает пользователю возможность отрисовки высококачественной, плавной, четкой линии – при отрисовке линия появляется с задержкой, рывком.
Часть третья, что думаю я
Работ было очень много, срезали, если линия не рисуется мгновенно.
Финал.
Конечно, я немного разочарован таким итогом. Но в целом опыта у меня прибавилось, и когда-нибудь, надеюсь, мне всё это пригодится.
А поскольку канал у нас образовательный (я очень хочу верить в это, и делаю всё необходимое), то после того, как я порефлексировал, собрался, в итоге оформил свои мысли в виде отдельного поста на хабре.
📖 Очень много кода, несколько необычных решений и примеров уже доступны вот тут:
⌨️ Большой пост на хабре.
❤️🔥Спасибо всем за вашу поддержку, коллеги.
@iOS Dev
📖 Очень много кода, несколько необычных решений и примеров уже доступны вот тут:
❤️🔥Спасибо всем за вашу поддержку, коллеги.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Холодный и тёплый запуск приложения — о чём речь?
Для начала пара слов о том, что такое «активация приложения». Она происходит, когда пользователь нажимает на иконку или иным образом возвращается в ваше приложение.
ℹ️ В iOS активация может быть либо запуском (
Launch — начало процесса, а resume — это когда в вашем приложении уже есть активный процесс, даже если он приостановлен.
Resume, как правило, намного быстрее, и работа по оптимизации запуска и возобновления отличается. В macOS система, например, не завершает ваш процесс в рамках обычного использования.
Что же такое холодный и тёплый запуски?
Активация вашего приложения значительно зависит от предыдущих действий на устройстве.
Например, в iOS, если вы свайпаете до хоумскрина и сразу же снова входите в приложение, то получите самую быструю возможную активацию. Вероятнее всего, это будет
Когда система определяет, что нужен запуск, это обычно называют «теплым запуском».
В iOS ваше приложение обычно вытесняется из памяти, чтобы предоставить foreground-приложению больше ресурсов.
Фреймворки также могут потребовать повторного запуска. Этот сценарий или запуск сразу после загрузки часто называют «холодным запуском».
Более корректно размышлять о тёплом и холодном запусках как о спектре.
Многое зависит и от состояния девайса, и именно из-за этого спектра тестирование в различных условиях необходимо для прогнозирования производительности в реальном мире.
📺 Для большего погружения рекомендую это видео с WWDC.
@iOS Dev
Для начала пара слов о том, что такое «активация приложения». Она происходит, когда пользователь нажимает на иконку или иным образом возвращается в ваше приложение.
ℹ️ В iOS активация может быть либо запуском (
launch
), либо возобновлением (resume
). Launch — начало процесса, а resume — это когда в вашем приложении уже есть активный процесс, даже если он приостановлен.
Resume, как правило, намного быстрее, и работа по оптимизации запуска и возобновления отличается. В macOS система, например, не завершает ваш процесс в рамках обычного использования.
Что же такое холодный и тёплый запуски?
Активация вашего приложения значительно зависит от предыдущих действий на устройстве.
Например, в iOS, если вы свайпаете до хоумскрина и сразу же снова входите в приложение, то получите самую быструю возможную активацию. Вероятнее всего, это будет
resume
. Когда система определяет, что нужен запуск, это обычно называют «теплым запуском».
В iOS ваше приложение обычно вытесняется из памяти, чтобы предоставить foreground-приложению больше ресурсов.
Фреймворки также могут потребовать повторного запуска. Этот сценарий или запуск сразу после загрузки часто называют «холодным запуском».
Более корректно размышлять о тёплом и холодном запусках как о спектре.
Многое зависит и от состояния девайса, и именно из-за этого спектра тестирование в различных условиях необходимо для прогнозирования производительности в реальном мире.
📺 Для большего погружения рекомендую это видео с WWDC.
@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Простой способ проверить тип в Swift
ℹ️ Кроме
Оператор проверки типа вернёт
В приведённом примере
Кстати, я изучаю возможности инструментов Apple и, как видите, гифки выходят на новый уровень!
@iOS Dev
ℹ️ Кроме
as?
можно использовать оператор проверки типа is
, чтобы проверить, относится ли экземпляр к определенному типу подкласса. Оператор проверки типа вернёт
true
, если экземпляр относится к этому типу подкласса, и false
, если нет.В приведённом примере
magicBool
может быть либо Int
, либо String
.@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
iOS Clean architecture на примере реализации фичи с использованием MVVM, Repository, URLSession
📖 В этом материале автор расскажет про:
1️⃣ Реализацию шаблона проектирования
2️⃣ Полностью несвязанную систему загрузки для любого источника данных с подходом
3️⃣ Создание клиента на базе
4️⃣ Корректное использование API.
И, что еще более важно, про создание функции, которую можно изолировать, смоделировать и протестировать на каждом уровне.
🛠 Бонус! Репозиторий с проектом, где вы сразу можете посмотреть на решение.
@iOS Dev
📖 В этом материале автор расскажет про:
1️⃣ Реализацию шаблона проектирования
MVVM
очень простым способом без дополнительных фреймворков.2️⃣ Полностью несвязанную систему загрузки для любого источника данных с подходом
Repository
.3️⃣ Создание клиента на базе
URLSession
.4️⃣ Корректное использование API.
И, что еще более важно, про создание функции, которую можно изолировать, смоделировать и протестировать на каждом уровне.
🛠 Бонус! Репозиторий с проектом, где вы сразу можете посмотреть на решение.
@iOS Dev
Как добавить поддержку файлов с любым расширением в вашем приложении?
🔆 Представьте ситуацию, что вы делаете кастомный видеоредактор или архиватор и нужно поддерживать не только стандартные, но и
Если необходимо заставить систему распознавать файл, вы можете использовать
В документации Apple четко указано, что новый тип должен соответствовать хотя бы одному из public-типов.
📖 Автор этой статьи доступно объясняет не только, как поддерживать кастомные типы данных и шарить их, но и как открывать эти файлы в вашем приложении.
@iOS Dev
свои файлы
в приложении.Если необходимо заставить систему распознавать файл, вы можете использовать
Document Types
и Exported Type Identifiers
. В документации Apple четко указано, что новый тип должен соответствовать хотя бы одному из public-типов.
public.data
— базовый тип для byte streams. public.content
— базовый тип для смешанного контента. Например, файл PDF содержит как текст, так и специальные данные форматирования.📖 Автор этой статьи доступно объясняет не только, как поддерживать кастомные типы данных и шарить их, но и как открывать эти файлы в вашем приложении.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Подборка необычных эффектов в IOS с конференции Tokyo iOS Meetup
Stack Overflow говорил, что это будет просто (спойлер: это оказалось отнюдь не просто)
Тим Оливер, в прошлом разработчик Realm и pixiv, делится своим опытом реализации сразу нескольких необычных вещей в iOS, кажущихся на первый взгляд тривиальными, но на самом деле содержащими непростую реализацию.
📺 Видео с конференции доступно здесь.
@iOS Dev
Stack Overflow говорил, что это будет просто (спойлер: это оказалось отнюдь не просто)
Тим Оливер, в прошлом разработчик Realm и pixiv, делится своим опытом реализации сразу нескольких необычных вещей в iOS, кажущихся на первый взгляд тривиальными, но на самом деле содержащими непростую реализацию.
📺 Видео с конференции доступно здесь.
@iOS Dev
Рекурсия в Swift: определение, примеры, код
Примером рекурсии в реальном мире может быть размещение двух параллельных зеркал друг против друга. Любой объект между ними будет отражаться рекурсивно.
Среди плюсов их использования:
🔘 Это делает наш код короче и чище.
🔘 Рекурсия требуется в задачах, касающихся структур данных и продвинутых алгоритмов, таких как обход графа и дерева.
Минусы, впрочем, тоже есть:
🔘 Это занимает больше места в стеке по сравнению с итеративной программой.
🔘 Реализация использует больше процессорного времени.
🔘 Отладка может быть более сложной по сравнению с эквивалентной итеративной программой.
📖 В этой статье наглядно объясняется, что такое рекурсивные функции в Swift и объясняется работа таких функций на примерах
@iOS Dev —рекурсия в Swift с примерами в этом посте
Примером рекурсии в реальном мире может быть размещение двух параллельных зеркал друг против друга. Любой объект между ними будет отражаться рекурсивно.
Среди плюсов их использования:
Минусы, впрочем, тоже есть:
📖 В этой статье наглядно объясняется, что такое рекурсивные функции в Swift и объясняется работа таких функций на примерах
@iOS Dev —
Please open Telegram to view this post
VIEW IN TELEGRAM
Async/await в Swift c примером использования на базе существующего проекта
ℹ️ Параллелизм в Swift означает возможность одновременного запуска нескольких фрагментов кода.
Пусть это и очень упрощенное описание, но оно должно дать вам представление о том, насколько важен параллелизм в Swift для производительности ваших приложений.
📖 Этот материал раскрывает следующие понятия:
🔘 Определение
🔘 Определение
🔘 Для чего нужен структурированный параллелизм (structured concurrency).
🔘 Добавление
@iOS Dev
Async await
является частью новых изменений структурированного параллелизма, которые появились в Swift 5.5 во время WWDC 2021. ℹ️ Параллелизм в Swift означает возможность одновременного запуска нескольких фрагментов кода.
Пусть это и очень упрощенное описание, но оно должно дать вам представление о том, насколько важен параллелизм в Swift для производительности ваших приложений.
📖 Этот материал раскрывает следующие понятия:
async
.await
.async-await
в существующий проект.@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Техники перехода между разными экранами: от простых к интерактивным
Каждая из статей ниже описывает решения автора, который создавал красивые кастомные переходы для собственного приложения, а также рассказывает о его шагах на пути к достижению цели.
1️⃣ Создание кастомных переиспользуемых переходов.
2️⃣ Переходы между экранами: добавляем естественности.
3️⃣ Переходы между экранами: задание произвольного размера.
Нельзя не согласиться с автором насчёт следующего вывода: иногда стоит приложить усилия, чтобы разобраться в непростом API, чтобы в будущем сэкономить время при реализации более сложных переходов.
🛠 Репозиторий с примерами кода из статьи.
@iOS Dev
Каждая из статей ниже описывает решения автора, который создавал красивые кастомные переходы для собственного приложения, а также рассказывает о его шагах на пути к достижению цели.
1️⃣ Создание кастомных переиспользуемых переходов.
2️⃣ Переходы между экранами: добавляем естественности.
3️⃣ Переходы между экранами: задание произвольного размера.
Нельзя не согласиться с автором насчёт следующего вывода: иногда стоит приложить усилия, чтобы разобраться в непростом API, чтобы в будущем сэкономить время при реализации более сложных переходов.
🛠 Репозиторий с примерами кода из статьи.
@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Реализация плавного перехода между цветами в Swift
Эту красивую технику можно создать, вычислив средний цвет входного изображения.
📖 Этот пример был создан с использованием изображений из Unsplash для создания желаемого эффекта.
🛠 Посмотреть на решение в коде можно на Github.
@iOS Dev
Эту красивую технику можно создать, вычислив средний цвет входного изображения.
📖 Этот пример был создан с использованием изображений из Unsplash для создания желаемого эффекта.
🛠 Посмотреть на решение в коде можно на Github.
@iOS Dev
Создание Keyboard Extension для азбуки Морзе
Отличным примером дополнительной клавиатуры является встроенная в iOS клавиатура с эмодзи.
📖 С помощью этого материала вы создадите одно из таких расширений для азбуки Морзе.
🧐 Автор даже считает, что к концу туториала вы сможете её выучить!
@iOS Dev
Keyboard Extensions
позволяют пользователям добавлять дополнительные клавиатуры в список доступных. Отличным примером дополнительной клавиатуры является встроенная в iOS клавиатура с эмодзи.
📖 С помощью этого материала вы создадите одно из таких расширений для азбуки Морзе.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Пример реализации диаграммы с затемнением до указанного момента времени
В этом материале можно узнать, как построить диаграмму, отображающую УФ-индекс в течение дня (похожую на системное приложение погоды).
На диаграмме также используется линейный градиент для значения УФ-индекса, реализовано отображение временной шкалы, и затемняющий слой для уже прошедшего отрезка.
🛠 Код доступен по этой ссылке.
@iOS Dev
В этом материале можно узнать, как построить диаграмму, отображающую УФ-индекс в течение дня (похожую на системное приложение погоды).
На диаграмме также используется линейный градиент для значения УФ-индекса, реализовано отображение временной шкалы, и затемняющий слой для уже прошедшего отрезка.
🛠 Код доступен по этой ссылке.
@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Анализ текста в реальном времени с помощью Word Tagger (+ пример приложения)
Возможно, вы помните материал от Максима Скорынина. Я выкладывал в канале первую часть большого материала про работу с CreateML и анализ текста.
📖 Вышло продолжение, в котором создаётся приложение для iOS с нуля, объясняется про GoogleMLKit/TextRecognition и используется Live Text, которые позволяют нам распознавать текст из видеопотока или изображения с помощью камеры телефона.
Кроме этого, используется модель Word Tagger для конвертации англоязычного текста. А также вы сможете узнать о применении фреймворка NaturalLanguagе в реальном проекте.
🛠 Полностью пример приложения можно посмотреть в этом репозитории.
@iOS Dev —если у вас есть примеры проектов или статей, которыми вы хотите поделиться с сообществом, напишите мне 🧑💻
Возможно, вы помните материал от Максима Скорынина. Я выкладывал в канале первую часть большого материала про работу с CreateML и анализ текста.
📖 Вышло продолжение, в котором создаётся приложение для iOS с нуля, объясняется про GoogleMLKit/TextRecognition и используется Live Text, которые позволяют нам распознавать текст из видеопотока или изображения с помощью камеры телефона.
Кроме этого, используется модель Word Tagger для конвертации англоязычного текста. А также вы сможете узнать о применении фреймворка NaturalLanguagе в реальном проекте.
🛠 Полностью пример приложения можно посмотреть в этом репозитории.
@iOS Dev —
Please open Telegram to view this post
VIEW IN TELEGRAM
10 советов для успешного запуска пет-проектов от автора avanderlee
1️⃣ Создайте фокус. По иронии судьбы, сторонние проекты — одна из самых больших ловушек для незавершенных побочных проектов.
2️⃣ Смотрите на вещи реалистично. Вы не сможете сделать всё сразу! От себя я бы добавил, что этот совет касается разработки и в крупных компаниях.
3️⃣ Установите приоритеты.
4️⃣ Планирование — это ключ.
5️⃣ 10 минут в день засчитываются за 5 часов в месяц.
6️⃣ Умейте остановиться вовремя, даже если вы получаете удовольствие (и вы готовы кодить до полуночи).
7️⃣ Создайте задачи на будущее. А #warning вам поможет.
8️⃣ Используйте автоматизацию и инструменты, чтобы сэкономить время.
9️⃣ Поднимите себе настроение с друзьями-единомышленниками.
🔟 Не стесняйтесь отпраздновать успех (или хотя бы запуск проекта).
На мой взгляд, при определённом менеджменте большинство этих советов будут работать автоматически и в рабочих проектах.
⭐️ А вот тут можно прочесть отличные от Пола Хадсона про профессиональное развитие.
@iOS Dev
1️⃣ Создайте фокус. По иронии судьбы, сторонние проекты — одна из самых больших ловушек для незавершенных побочных проектов.
2️⃣ Смотрите на вещи реалистично. Вы не сможете сделать всё сразу! От себя я бы добавил, что этот совет касается разработки и в крупных компаниях.
3️⃣ Установите приоритеты.
4️⃣ Планирование — это ключ.
5️⃣ 10 минут в день засчитываются за 5 часов в месяц.
6️⃣ Умейте остановиться вовремя, даже если вы получаете удовольствие (и вы готовы кодить до полуночи).
7️⃣ Создайте задачи на будущее. А #warning вам поможет.
8️⃣ Используйте автоматизацию и инструменты, чтобы сэкономить время.
9️⃣ Поднимите себе настроение с друзьями-единомышленниками.
🔟 Не стесняйтесь отпраздновать успех (или хотя бы запуск проекта).
На мой взгляд, при определённом менеджменте большинство этих советов будут работать автоматически и в рабочих проектах.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
Причина и два способа исправить ошибку: «The compiler is unable to type-check this expression in reasonable time»
Вполне возможно, что вы сталкивались с этой ошибкой при разработке. Конечно, причины могут быть различны, но все они будут сводиться примерно к одному и тому же.
Например, комбинация выражений
Два простых способа, которые помогут победить этот неприятный момент:
1️⃣ Разбить длинное выражение на более мелкие.
2️⃣ Можно уменьшить количество выражений.
📖 Детальнее можно прочесть в этой статье.
👩🎓 Кстати, вы знали, что оператор
@iOS Dev
Вполне возможно, что вы сталкивались с этой ошибкой при разработке. Конечно, причины могут быть различны, но все они будут сводиться примерно к одному и тому же.
Например, комбинация выражений
=, +, try, await
слишком сложна для компилятора Swift.Два простых способа, которые помогут победить этот неприятный момент:
1️⃣ Разбить длинное выражение на более мелкие.
// Вместо
var longExpression = "a" + "b" + "c" + "d"
// Использовать
var temp1 = "a" + "b"
var temp2 = "c" + "d"
var smallerExpression = temp1 + temp2
2️⃣ Можно уменьшить количество выражений.
// Вместо
var longExpression = "a" + "b" + "c" + "d"
// Использовать
var reduceExpression = "ab" + "cd"
📖 Детальнее можно прочесть в этой статье.
+
мощно перегружен и содержит около 60 различных функций?@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM
UIScrollView и как он работает
📖 Илья Лобанов подробно рассказывает о том, как работает UIScrollView: приводит примеры замедления, баунса, spring animation и rubber band effect.
И даёт советы, как можно добиться естественной анимации и отзывчивого интерфейса в приложениях.
В материале можно получить представление и примеры работы со следующими эффектами:
🔘 Тестовый SimpleScrollView.
🔘 Замедление (Deceleration).
🔘 Реализация замедления.
🔘 Анимация пружины (Spring Animation).
🔘 Spring Animation в iOS SDK.
🔘 Реализация анимации пружины.
🔘 Rubber Band Effect.
🔘 Реализация Rubber Band Effect.
🔘 Примеры использования.
📺 Видео доклада можно посмотреть здесь.
🛠 Примеры кода из статьи: github.
🤩 Бонус: видео с WWDC о проектировании интерфейсов.
@iOS Dev
📖 Илья Лобанов подробно рассказывает о том, как работает UIScrollView: приводит примеры замедления, баунса, spring animation и rubber band effect.
И даёт советы, как можно добиться естественной анимации и отзывчивого интерфейса в приложениях.
В материале можно получить представление и примеры работы со следующими эффектами:
🔘 Тестовый SimpleScrollView.
🔘 Замедление (Deceleration).
🔘 Реализация замедления.
🔘 Анимация пружины (Spring Animation).
🔘 Spring Animation в iOS SDK.
🔘 Реализация анимации пружины.
🔘 Rubber Band Effect.
🔘 Реализация Rubber Band Effect.
🔘 Примеры использования.
📺 Видео доклада можно посмотреть здесь.
🛠 Примеры кода из статьи: github.
@iOS Dev
Please open Telegram to view this post
VIEW IN TELEGRAM