How We Centrally Manage UITabBar in Our iOS Apps
(4 мин)
Иногда бывает нужно скрыть UITabBar. Авторы делятся опытом реализации и дают следующие советы по управлению UITabBar:
👉 Единый метод для показа/скрытия UITabBar вместо
👉 Управление показом/скрытием в одном месте.
#ui
(4 мин)
Иногда бывает нужно скрыть UITabBar. Авторы делятся опытом реализации и дают следующие советы по управлению UITabBar:
👉 Единый метод для показа/скрытия UITabBar вместо
hidesBottomBarWhenPushed
, tabbar.isHidden
или tabbar.frame
👉 Управление показом/скрытием в одном месте.
MainTabBarNavigationManager: UINavigationControllerDelegate
и задать его делегатом для всех navigation controller'ов#ui
👍4👎1
Управление загрузками в Xcode
Начиная с Xcode 14, симуляторы для watchOS и tvOS доступны в виде отдельных загрузок. Данное решение позволяет значительно уменьшать размер загрузки приложения, однако теперь вам придется самостоятельно управлять этими большими (3-4 ГБ) компонентами.
Автор сэкономил 32ГБ дискового пространства, подробнее в статье
#optimization
Начиная с Xcode 14, симуляторы для watchOS и tvOS доступны в виде отдельных загрузок. Данное решение позволяет значительно уменьшать размер загрузки приложения, однако теперь вам придется самостоятельно управлять этими большими (3-4 ГБ) компонентами.
Автор сэкономил 32ГБ дискового пространства, подробнее в статье
#optimization
👍5
Советы по отладке при работе над проектами Swift
👉 Настройте свой .lldbinit. Например, чтобы поменять язык или добавить дополнительные возможности к отладчику
👉 Используйте переменные фрейма: frame variable или v для сохраненных свойств вместо po
👉 Наблюдайте за системой. Брейкпоинты могут быть использованы для многих вещей, от изменения входных данных по умолчанию в поля (например, формы входа) до использования команд отладчика для создания цепочек символических брейкпоинтов
👉 Используйте
как брейкпоинт при изменении переменной
#tools
👉 Настройте свой .lldbinit. Например, чтобы поменять язык или добавить дополнительные возможности к отладчику
👉 Используйте переменные фрейма: frame variable или v для сохраненных свойств вместо po
👉 Наблюдайте за системой. Брейкпоинты могут быть использованы для многих вещей, от изменения входных данных по умолчанию в поля (например, формы входа) до использования команд отладчика для создания цепочек символических брейкпоинтов
👉 Используйте
watchpoint set variable self.homeViewController
как брейкпоинт при изменении переменной
#tools
👍8
Как провести эффективное тестирование мобильных приложений? Стратегия пятиуровневой пирамиды тестов
Взяв за основу тестовую пирамиду Мартина Фаулера, авторы создали свой вариант пирамиды, состоящий из 5 уровней. Двигаясь от нижнего к верхнему уровню, все меньше зависимостей должно быть заменено моками и все сильнее растет стоимость реализации теста (вторая картинка).
#testing
Взяв за основу тестовую пирамиду Мартина Фаулера, авторы создали свой вариант пирамиды, состоящий из 5 уровней. Двигаясь от нижнего к верхнему уровню, все меньше зависимостей должно быть заменено моками и все сильнее растет стоимость реализации теста (вторая картинка).
#testing
👍6👎1
Простые метрики по качеству: как их вести и зачем они нужны
👉 Зачем? Это поможет увидеть общую картину того, как обстоят дела с качеством на проекте, и на каком этапе у нас основные проблемы. Кроме того, это может помочь в отслеживании динамики качества, но важно понимать, что качество проекта — это суммарная работа всей команды, а не только QA отдела.
👉 Как? Для того, чтобы вести такую статистику, не нужно много ресурсов — это может сделать один человек, уделяя этой задаче ~1-4 часа в неделю. Однако для того, чтобы увидеть глобальную картину, может потребоваться около полугода, поскольку статистика — это переменная, изменяющаяся во времени.
Примеры метрик: баги после релиза, баги во время регресса
#qa
👉 Зачем? Это поможет увидеть общую картину того, как обстоят дела с качеством на проекте, и на каком этапе у нас основные проблемы. Кроме того, это может помочь в отслеживании динамики качества, но важно понимать, что качество проекта — это суммарная работа всей команды, а не только QA отдела.
👉 Как? Для того, чтобы вести такую статистику, не нужно много ресурсов — это может сделать один человек, уделяя этой задаче ~1-4 часа в неделю. Однако для того, чтобы увидеть глобальную картину, может потребоваться около полугода, поскольку статистика — это переменная, изменяющаяся во времени.
Примеры метрик: баги после релиза, баги во время регресса
#qa
👍6
The Future of Foundation
Новый open source Foundation:
👉 Благодаря нативной реализации Foundation больше не несет затраты на конвертацию между C и Swift, что приводит к повышению производительности
👉 Более мелкие и гранулированные пакеты Foundation. FoundationEssentials предоставит наиболее важные типы без системных зависимостей. FoundationInternationalization для работы с локализованным контентом. Другие пакеты будут продолжать обеспечивать поддержку XML и работу с сетью. Новый пакет FoundationObjCCompatibility будет содержать устаревшие API.
👉 Множественные реализации любого API чреваты различиями в поведении и, в конечном счете, ошибками при перемещении кода между платформами. Новый пакет Foundation будет служить ядром единой канонической реализации, независимо от платформы.
👉 Новый открытый процесс внесения изменений в API Foundation
#swift
Новый open source Foundation:
👉 Благодаря нативной реализации Foundation больше не несет затраты на конвертацию между C и Swift, что приводит к повышению производительности
👉 Более мелкие и гранулированные пакеты Foundation. FoundationEssentials предоставит наиболее важные типы без системных зависимостей. FoundationInternationalization для работы с локализованным контентом. Другие пакеты будут продолжать обеспечивать поддержку XML и работу с сетью. Новый пакет FoundationObjCCompatibility будет содержать устаревшие API.
👉 Множественные реализации любого API чреваты различиями в поведении и, в конечном счете, ошибками при перемещении кода между платформами. Новый пакет Foundation будет служить ядром единой канонической реализации, независимо от платформы.
👉 Новый открытый процесс внесения изменений в API Foundation
#swift
👍7
Не обманывайте себя: вы не «исправите это потом»
Шансы на то, что «костыль» будет исправлен, неуклонно снижаются с течением времени и вот почему:
👉 Преимущества от усовершенствования кода не перевешивают риска что-нибудь испортить
👉 Чем дольше с чем-нибудь живешь, тем сильнее привыкаешь к такому положению вещей
👉 На одной чаше весов исправление, связанное с большими рисками и малыми преимуществами. На другой – что-нибудь из нового, что мы хотели бы реализовать или доработать
👉 Новый код завязан на «плохом» фрагменте и, вероятно, выйдет из строя, если в этом фрагменте что-то изменим
Чаще всего выбор звучит так: «исправить сейчас» или «смириться с тем, что не исправим никогда».
Исходя из этого осознания мы можем точнее расставлять приоритеты и лучше выстроить процессы.
#softskills
Шансы на то, что «костыль» будет исправлен, неуклонно снижаются с течением времени и вот почему:
👉 Преимущества от усовершенствования кода не перевешивают риска что-нибудь испортить
👉 Чем дольше с чем-нибудь живешь, тем сильнее привыкаешь к такому положению вещей
👉 На одной чаше весов исправление, связанное с большими рисками и малыми преимуществами. На другой – что-нибудь из нового, что мы хотели бы реализовать или доработать
👉 Новый код завязан на «плохом» фрагменте и, вероятно, выйдет из строя, если в этом фрагменте что-то изменим
Чаще всего выбор звучит так: «исправить сейчас» или «смириться с тем, что не исправим никогда».
Исходя из этого осознания мы можем точнее расставлять приоритеты и лучше выстроить процессы.
#softskills
👍11👎2
Вышла Lottie 4.0 для iOS с поддержкой Core Animation
Lottie — это кроссплатформенная библиотека Airbnb с открытым исходным кодом для рендеринга векторной анимированной графики.
В Lottie 4.0 значительно улучшена производительность всех анимаций благодаря совершенно новому движку рендеринга на базе Core Animation.
В предыдущих версиях один раз за кадр код выполнялся в основном потоке для продвижения анимации и повторного рендеринга ее содержимого, а значит потреблялось от 5 до 20%+ CPU во время воспроизведения, оставляя меньше циклов процессора доступным для остальной части приложения.
#animation
Lottie — это кроссплатформенная библиотека Airbnb с открытым исходным кодом для рендеринга векторной анимированной графики.
В Lottie 4.0 значительно улучшена производительность всех анимаций благодаря совершенно новому движку рендеринга на базе Core Animation.
В предыдущих версиях один раз за кадр код выполнялся в основном потоке для продвижения анимации и повторного рендеринга ее содержимого, а значит потреблялось от 5 до 20%+ CPU во время воспроизведения, оставляя меньше циклов процессора доступным для остальной части приложения.
#animation
🔥11👍1👎1
Apple to Allow Outside App Stores in Overhaul Spurred by EU Laws
Apple может разрешить сторонние магазины приложений для iPhone и iPad для соблюдения требований Евросоюза.
Важно отметить, что эти изменения коснутся только Европы, однако могут быть распространены на другие страны при принятии аналогичных законов.
#слухи
Apple может разрешить сторонние магазины приложений для iPhone и iPad для соблюдения требований Евросоюза.
Важно отметить, что эти изменения коснутся только Европы, однако могут быть распространены на другие страны при принятии аналогичных законов.
#слухи
🔥11👎5
Coordinator pattern with Tab Bar Controller
Как настроить навигацию в iOS приложении, где есть различные флоу и UITabBarController?
👉 Создаем AppCoordinator - это главный координатор приложения. Он должен быть строго один❗️
👉 AppCoordinator будет открывать и хранить в childCoordinators основные флоу. Например, Login и TabBar
👉 Каждый последующий флоу может иметь собственный координатор, открывать новые флоу и сохранять их в свои childCoordinators
👉 Каждый координатор в методе start() открывает новый флоу на родительском, а в методе finish() - закрывает и говорит родительскому координатору взять на себя управление после закрытия
👉 TabBarCoordinator открывает несколько флоу одновременно для каждого таба и умеет переключать эти табы
#ui
Как настроить навигацию в iOS приложении, где есть различные флоу и UITabBarController?
👉 Создаем AppCoordinator - это главный координатор приложения. Он должен быть строго один❗️
👉 AppCoordinator будет открывать и хранить в childCoordinators основные флоу. Например, Login и TabBar
👉 Каждый последующий флоу может иметь собственный координатор, открывать новые флоу и сохранять их в свои childCoordinators
👉 Каждый координатор в методе start() открывает новый флоу на родительском, а в методе finish() - закрывает и говорит родительскому координатору взять на себя управление после закрытия
👉 TabBarCoordinator открывает несколько флоу одновременно для каждого таба и умеет переключать эти табы
#ui
❤12
This media is not supported in your browser
VIEW IN TELEGRAM
clipped() не оказывает влияния на проверку касаний
Модификатор clipped() в SwiftUI обрезает вью до своих(модификатора) границ, скрывая все, что выходит за пределы этих границ. Но обратите внимание, что обрезание не влияет на проверку касаний (hit testing); обрезанный вью по-прежнему принимает тапы / клики за пределами видимой области.
#ui
Модификатор clipped() в SwiftUI обрезает вью до своих(модификатора) границ, скрывая все, что выходит за пределы этих границ. Но обратите внимание, что обрезание не влияет на проверку касаний (hit testing); обрезанный вью по-прежнему принимает тапы / клики за пределами видимой области.
#ui
👍8👎2
AppCode 2022.3 Release and End of Sales and Support
Вышел релиз AppCode 2022.3, совместимый с macOS 13 и Xcode 14.2. Также было объявлено о завершении проекта. На 14 декабря прекращена продажа и обновление подписок AppCode.
#tools
Вышел релиз AppCode 2022.3, совместимый с macOS 13 и Xcode 14.2. Также было объявлено о завершении проекта. На 14 декабря прекращена продажа и обновление подписок AppCode.
#tools
😢15😁5👍1👎1
Удаляем фон у фото используя CoreML
В статье описан опыт внедрения модели U2Net в приложение для создания коллажа. Исторически, обрезание фона происходило на устройстве силами библиотеки GPUImage, но результат оставлял желать лучшего. U2Net справляется с задачей на отлично, при этом light версия модели весит 4.6 мб, full - 175.9 мб и грузится в фоне.
#ml #swift
В статье описан опыт внедрения модели U2Net в приложение для создания коллажа. Исторически, обрезание фона происходило на устройстве силами библиотеки GPUImage, но результат оставлял желать лучшего. U2Net справляется с задачей на отлично, при этом light версия модели весит 4.6 мб, full - 175.9 мб и грузится в фоне.
#ml #swift
👍8👎1
Как устроено приложение Калькулятор на iPhone
Приложение маленькое, но сделано на сценах.
Ширину лейбла внутри контейнера с полем для ввода пересчитывают при каждом вводе новой цифры или операции. На вью добавили 3 жеста - свайп, лонг-пресс и тап.
В портретном режиме скрытых
Приложение поддерживает
#ios
Приложение маленькое, но сделано на сценах.
Ширину лейбла внутри контейнера с полем для ввода пересчитывают при каждом вводе новой цифры или операции. На вью добавили 3 жеста - свайп, лонг-пресс и тап.
В портретном режиме скрытых
UIView
нет. Значит, при повороте устройства, новые кнопки добавляются и расставляются на лету. Кнопки из портретного режима сохраняются между поворотами.Приложение поддерживает
Voice Over
и Voice Control
для всех интерактивных элементов.#ios
👍13👎1
Stack Overflow: 74% of developers are open to new jobs
Зарплата - основной мотиватор сменить работу для ~54% опрошенных. Другими причинами респонденты называли возможности для роста (~38%), желание поработать с новыми технологиями (~35%) и баланс работы и отдыха (23%).
Причины, которые делают компанию более привлекательной: developer experience (42%), продукт (35%) и обучение у разработчиков за пределами команды (34%).
#оффтоп
Зарплата - основной мотиватор сменить работу для ~54% опрошенных. Другими причинами респонденты называли возможности для роста (~38%), желание поработать с новыми технологиями (~35%) и баланс работы и отдыха (23%).
Причины, которые делают компанию более привлекательной: developer experience (42%), продукт (35%) и обучение у разработчиков за пределами команды (34%).
#оффтоп
👍8👎1
Understand Swift Autoclosures (4 мин)
Autoclosure оборачивает аргумент функции в closure. При вызове autoclosure, возвращается результат выражения, обернутого в него.
Довольно часто мы вызываем функции, которые используют autoclosure (например, метод assert в тестах), но редко пишем их сами. В некоторых случаях autoclosure может синтаксически улучшить код.
#swift
Autoclosure оборачивает аргумент функции в closure. При вызове autoclosure, возвращается результат выражения, обернутого в него.
Довольно часто мы вызываем функции, которые используют autoclosure (например, метод assert в тестах), но редко пишем их сами. В некоторых случаях autoclosure может синтаксически улучшить код.
#swift
👍9😁1
The Hidden Cost of Software Automation (9 мин)
Автоматизация стоит дороже, чем кажется, и вот почему:
1. Нестандартные решений. Под данным пунктом можно понимать цену изучения инструментов для автоматизации
2. Поддержка. Может потребоваться отдельная команда DevOps
3. Потерянный контекст. Если человек, который поддерживал автоматизированное решение уволится, не поучится ли так, что автоматизацию придется делать заново?
Таким образом, автоматизация - это отдельная часть разработки, создание которой - только вершина айсберга. Она нуждается в изменениях и улучшениях. Если этим не заниматься, однажды она превратится в никому непонятный черный ящик.
#процессы
Автоматизация стоит дороже, чем кажется, и вот почему:
1. Нестандартные решений. Под данным пунктом можно понимать цену изучения инструментов для автоматизации
2. Поддержка. Может потребоваться отдельная команда DevOps
3. Потерянный контекст. Если человек, который поддерживал автоматизированное решение уволится, не поучится ли так, что автоматизацию придется делать заново?
Таким образом, автоматизация - это отдельная часть разработки, создание которой - только вершина айсберга. Она нуждается в изменениях и улучшениях. Если этим не заниматься, однажды она превратится в никому непонятный черный ящик.
#процессы
👍4👎1
👍8👎1