Apple ускоряет разработку гарнитуры смешанной реальности
По словам Bloomberg, компания планирует представить гарнитуру уже в следующем году вместе со специальной операционной системой и магазином приложений.
Ожидается, что его первое устройство в этой области будет намного дороже, чем существующие основные конкуренты, и будет включать в себя экраны сверхвысокого разрешения для виртуальной реальности и несколько внешних камер для обработки элементов дополненной реальности. Оно также будет иметь возможности отслеживания рук и работать на процессоре на базе чипа M2 — компонента, представленного в последних компьютерах Mac компании.
#слухи
По словам Bloomberg, компания планирует представить гарнитуру уже в следующем году вместе со специальной операционной системой и магазином приложений.
Ожидается, что его первое устройство в этой области будет намного дороже, чем существующие основные конкуренты, и будет включать в себя экраны сверхвысокого разрешения для виртуальной реальности и несколько внешних камер для обработки элементов дополненной реальности. Оно также будет иметь возможности отслеживания рук и работать на процессоре на базе чипа M2 — компонента, представленного в последних компьютерах Mac компании.
#слухи
🔥7👎2🤔2😱1
Делаем плавный скролл в нагруженных таблицах
Способы оптимизации таблицы, рассмотренные в статье:
👉 Повторное использование ячеек/хедеров и футеров — первый и важный шаг оптимизации
👉 Уменьшить общее время загрузки и вычислений, их перевод в Background-очереди — значит упростить объем подсчетов
👉 Использование стандартных компонентов Core Animation для отрисовки ячеек позволит существенно ускорить процесс отображения и повысить производительность
👉 Кеширование данных для ячеек
👉 Нет ничего плохого в комбинации Auto Layout и ручного подсчета. Там, где не хватает производительности — использовать ручной подсчет
#optimization
Способы оптимизации таблицы, рассмотренные в статье:
👉 Повторное использование ячеек/хедеров и футеров — первый и важный шаг оптимизации
👉 Уменьшить общее время загрузки и вычислений, их перевод в Background-очереди — значит упростить объем подсчетов
👉 Использование стандартных компонентов Core Animation для отрисовки ячеек позволит существенно ускорить процесс отображения и повысить производительность
👉 Кеширование данных для ячеек
👉 Нет ничего плохого в комбинации Auto Layout и ручного подсчета. Там, где не хватает производительности — использовать ручной подсчет
#optimization
👍9❤3👎2🤔1😢1
The Ultimate How-to: Build a Bluetooth Swift App With Hardware in 20 Minutes
👉 Добавляем
👉 Создайте классы
и
👉 Имплементируем протоколы их делегатов CBPeripheralDelegate и CBCentralManagerDelegate
👉 Реализуем основной метод
👉 Дальше через созданный менеджер ищем устройства с помощью метода
👉 Осталось только запомнить найденное устройства в методе
#swift
👉 Добавляем
import CoreBluetooth
👉 Создайте классы
CBCentralManager
, сервис для работы с Bluetooth и
CBPeripheral
для отслеживания работы уже подключеннного устройства, чтобы узнать, что устройство, например, отсоединилось👉 Имплементируем протоколы их делегатов CBPeripheralDelegate и CBCentralManagerDelegate
👉 Реализуем основной метод
func centralManagerDidUpdateState(_ central: CBCentralManager)
чтобы узнать влючен ли Bluetooth на устройстве👉 Дальше через созданный менеджер ищем устройства с помощью метода
scanForPeripheralsWithServices
❗️Не забудьте после найденного результата прекратить поиск с помощью метода stopScan
👉 Осталось только запомнить найденное устройства в методе
centralManagerdidDiscover
и ❗️обязательно сохранить его сильной ссылкой иначе подключение прервется#swift
👍11
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