Мобильная разработка
13.1K subscribers
978 photos
238 videos
3.1K links
Актуальное по мобильной разработке — Android, iOS, кроссплатформа

Разместить рекламу: @tproger_sales_bot
Правила общения: https://tprg.ru/rules
Другие каналы: @tproger_channels
Сайт: https://tprg.ru/site

Регистрация в перечне РКН: https://tprg.ru/oVBP
Download Telegram
Как связать список и экран деталей анимацией в Jetpack Compose

Схема интеграции с Navigation Compose: SharedTransitionLayout размещают над NavHost, а элементам списка и экрана деталей задают одинаковый ключ по ID. Compose сопоставляет их и анимирует положение и размер.

Для одного изображения подходит sharedElement, для карточки с меняющимся содержимым — sharedBounds. Не используйте индекс списка как ключ: после перестановки элементы могут связаться неверно.

Длительность лучше держать в пределах 300–400 мс и учитывать системное отключение анимаций.
👍1
Как тестировать App Intents и Spotlight без автоматизации интерфейса

На WWDC26 Apple показала AppIntentsTesting для интеграционных тестов App Intents в iOS. Проверки запускают интенты на устройстве через тот же стек, что Siri, Shortcuts и Spotlight, но не зависят от интерфейса приложения или системы.

Тесты живут в обычном пакете XCUITest и обращаются к приложению по идентификатору пакета. Можно выполнить интент, проверить результат, прогнать запрос сущностей, связать несколько интентов и проверить индексацию Spotlight. Код приложения импортировать не нужно; приложение и средство запуска тестов должны использовать одну команду разработчика в настройках подписи.

В докладе с примерами кода также разбирают подготовку тестовых данных и запуск проверок в CI. Так регрессии интеграций с Siri и Shortcuts можно ловить без ручной проверки интерфейса.
❤1👏1
Когда SubcomposeLayout в Jetpack Compose оправдывает свою цену

Обычный Layout измеряет и размещает готовое дерево. SubcomposeLayout создаёт компоненты во время измерения, когда уже известны ограничения родителя, поэтому обходится дороже.

Он нужен, когда размер определяет состав интерфейса: например, строка тегов создаёт элементы до границы экрана и добавляет счётчик скрытых.

В разборе механики и DynamicChipRow показано, почему для расчёта одних размеров обычно достаточно Layout.
👌1
Как сделать прокрутку LazyVStack в SwiftUI предсказуемее

LazyVStack не строит весь список сразу: он загружает элементы у видимой области, а размеры строк за экраном оценивает по уже размещённым. Когда реальные размеры отличаются, стек уточняет общую высоту и смещение ScrollView. Поэтому логика, привязанная к абсолютному смещению, может срабатывать в разных местах.

Для длинной ленты в iOS полезны три правила: задавать предсказуемую высоту строк с переменным текстом; не сдвигать анимацией невидимые элементы в область экрана; отслеживать появление строк через onScrollTargetVisibilityChange, а не по абсолютному смещению.

Apple подробно разбирает оценку размеров, загрузку представлений, предзагрузку и программную прокрутку. Доклад рассчитан на разработчиков, уже знакомых с компоновкой стеков в SwiftUI.
❤1👍1
Как подключать новые API SwiftUI без повышения минимальной версии iOS

Если приложению нужен модификатор toolbarVerticalBehavior из версии 27.1, необязательно сразу менять deployment target для всего проекта. Обёртка Backport проверяет доступность API: на новой системе вызывает модификатор, а на старой возвращает исходное представление без изменений.

Так проверки версии собираются в одном месте, а вызовы получают отдельное пространство имён .backport. Для API, поведение которых нужно воспроизвести на старых версиях iOS, в ветке совместимости можно добавить собственную реализацию.

Альтернатива пространству имён: префикс ported и аннотация @available. Когда минимальная версия приложения дорастёт до штатного API, компилятор предупредит об устаревшей обёртке. Это помогает сохранить поддержку прежнего deployment target и не забыть удалить временный код.
🤝2👎1
Как проверить Auto Layout в iOS 26 на iPhone 17 и Air

У iPhone 17 и 17 Pro логическая область экрана составляет 402 × 874 пункта, у Air: 420 × 912, у Pro Max: 440 × 956. В портретной ориентации ширина у всех относится к классу Compact. В альбомной Air и Pro Max переходят в Regular, а 17 и 17 Pro остаются в Compact.

Безопасную область стоит отдельно проверить в альбомной ориентации. Верхний отступ у всех четырёх моделей равен 20 пунктам. У Air боковые отступы составляют 68 пунктов, нижний: 29; у остальных моделей боковые: 62, нижний: 20.

Для App Store Connect правило не изменилось: достаточно одного набора скриншотов для iPhone под дисплей 6,9 или 6,5 дюйма, остальные размеры масштабируются. Таблица размеров, классов ширины и безопасных отступов поможет выбрать конфигурации симулятора для проверки Auto Layout.
🤝2❤1
Liquid Glass в SwiftUI: как выбрать regular или clear на iOS 26

Модификатор glassEffect() по умолчанию использует вариант .regular. Он сильнее размывает фон и подбирает цвет стандартных надписей и символов под изображение позади панели. В примере с тёмными обоями символы остаются светлыми даже при светлой цветовой схеме интерфейса.

Вариант .clear прозрачнее и сохраняет больше деталей фотографии или видео. Но цвет символов у него зависит от светлой или тёмной схемы: на тёмном фоне при Light Mode они могут остаться тёмными и потерять контраст.

Для навигации и большинства кнопок стоит выбирать .regular. Если контент под панелью нужно сохранить видимым, подойдёт .clear, но контраст придётся проверить на разных кадрах и при необходимости добавить затемнение. Сравнение вариантов содержит код и примеры для обеих цветовых схем.
❤1
Как заставить VoiceOver озвучивать карточку SwiftUI целиком

Составную карточку с иконкой, названием и числом VoiceOver может прочитать как набор несвязанных элементов: «изображение, текст, текст». Модификатор .accessibilityElement(children: .combine) объединяет дочерние представления в один логический элемент.

После объединения задайте короткое основное описание через .accessibilityLabel(), текущее состояние через .accessibilityValue(), а дополнительный контекст через .accessibilityHint(). Например, карточка со звездой, числом 42 и подписью Favorites вместо трёх отдельных фрагментов будет звучать как «Favorites: 42».

Для проверки включите VoiceOver в настройках доступности iOS и пройдите по карточкам свайпами. Каждая должна озвучиваться как законченный объект с понятным названием и состоянием. Код карточки и сценарий проверки VoiceOver помогут сверить реализацию.
🔥1
Как проверять другую ветку в Android Studio через Git worktree

Git worktree создаёт для ветки отдельную рабочую папку, которая использует общую историю основного репозитория. Поэтому незакоммиченные изменения текущей задачи можно оставить на месте, а ветку коллеги открыть во втором окне Android Studio. Отдельными будут и рабочие файлы, и каталоги сборки, хотя это само по себе не гарантирует отсутствие повторных сборок Gradle.

Новый каталог и ветка создаются командой git worktree add ../myapp-review -b review/fix. Доступные рабочие деревья показывает git worktree list, а после ревью каталог удаляется через git worktree remove ../myapp-review. Одну ветку нельзя одновременно открыть в нескольких worktree.

Практическое руководство по Git worktrees также разбирает перенос изменений в основную ветку и организацию параллельной работы без постоянных переключений и stash.
👍1
Как адаптировать модальные экраны SwiftUI к сгибу iPhone Duo

На iPhone Duo модальный экран меняет размер и положение в зависимости от шести состояний устройства. В закрытой портретной ориентации кнопки подтверждения и закрытия переходят на боковую вертикальную панель, на полностью раскрытом экране остаются сверху, а при частичном сгибе в альбомной ориентации сам экран сдвигается на одну половину дисплея.

Если в панели нужна только одна кнопка, например Close, вертикальную полосу можно отключить модификатором .toolbarVerticalBehavior(.disabled). Его применяют к содержимому внутри NavigationStack, чтобы освободить ширину формы.

Разбор всех шести положений iPhone Duo поможет проверить доступность элементов. Системные sheets, alerts и menus уже отводят интерактивные элементы от изогнутого центра, но собственную вёрстку стоит проверить во всех положениях.
❤1
Android CLI получил Device Streaming для тестов на реальных смартфонах

Google добавила в Android CLI поддержку Device Streaming: теперь консоль и ИИ-агенты могут работать с физическими устройствами в облаке. Подключение идет через защищенный ADB over SSL, поэтому удаленный смартфон виден тулчейну так же, как если бы был подключен по USB.

Из терминала можно деплоить сборки, выгружать системные логи и трейсы, а также снимать скриншоты в headless-режиме. Параллельно каталог официальных инструкций Android skills вырос до 20+ файлов SKILL.md: от профилирования в PerfettoSQL и миграции на CameraX до аудита правил Google Play.

В блоге привели кейс команды FotMob: с навыком по Wear Compose Material 3 инженеры за один день перевели восемь списков на TransformingLazyColumn и убрали рукописный rotary-код. При этом инструкции поймали ошибки модели — забытый contentPadding и хардкод размеров sp.

@mobi_dev
This media is not supported in your browser
VIEW IN TELEGRAM
❤5👍3👎2💯1