iOS Broadcast – Telegram
iOS Broadcast
3.46K subscribers
1.84K photos
87 videos
1.04K links
Подборка новостей и статей для iOS разработчиков.

Новости Kotlin и мультиплатформы @kotlin_broadcast
Новости Android @android_broadcast
Реклама и прочее @ab_manager
Download Telegram
📱 Текстовые эффекты в SwiftUI с TextRenderer
С выходом iOS 17 и новых версий SwiftUI Apple представила протокол TextRenderer — инструмент, который даёт полный контроль над отрисовкой текста: от линий и слов до отдельных глифов.
Теперь текст можно анимировать, трансформировать и буквально «оживлять».

Ограниченные возможности стандартного Text
🔵Ранее разработчики могли изменять стиль только через модификаторы .font(), .foregroundStyle(), .kerning(), без доступа к самому процессу отрисовки.
🔵Нельзя было сделать продвинутые визуальные эффекты: поэтапное исчезание, покачивание символов, градиенты по строкам.

Использование TextRenderer
🔵Новый протокол предоставляет метод draw(layout:in:), который позволяет работать напрямую с каждой строкой, глифом или атрибутом.
🔵Можно комбинировать с Animatable для создания динамических эффектов (например, пульсации текста).
🔵Через TextAttribute можно задавать разные визуальные эффекты для отдельных частей текста — слово или даже буква могут «жить» отдельно.

Практические идеи:
🔵Создавать визуальные переходы и эффекты появления текста в onboarding-экранах.
🔵Добавлять акценты и микродвижения для повышения вовлеченности пользователя.
🔵Использовать эффекты бережно — цель в выразительности, а не в декорации.

TextRenderer превращает текст в полноценный графический объект SwiftUI.
Теперь дизайнерская выразительность и контроль за рендерингом текста доступны без выхода из декларативной модели SwiftUI.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
8
iOS Broadcast
🎹 Розыгрыш билета на Mobius Осень 2025. Для участия надо быть подписанным на @ios_broadcast и нажать "Участвую!" Итоги розыгрыша - 06 ноября
🎉 Результаты розыгрыша:

🏆 Победитель:
1. Evgeniy (@Evgeniy_Shevtsov)

✔️Проверить результаты
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🎉2
📱 SwiftUI Canvas API — графика нового поколения для iOS
Продолжаем разбираться с нововведениями в SwiftUI, на этот раз доступными уже с iOS 15. Стандартные декларативные View не позволяют реализовать сложную графику или кастомные визуальные эффекты.
🔴До появления Canvas разработчикам приходилось переходить в UIKit/Metal или использовать сложные трюки с Path и Shape
🔴Высокопроизводительная графика, частицы, шейдеры — всё это было вне удобной области SwiftUI

Решение: использование Canvas API
🟢Canvas предоставляет GraphicsContext и позволяет рисовать сразу на уровне пикселей, линий, фигур — прямо внутри SwiftUI
🟢Поддержка GPU-шейдеров и эффектов, Canvas стал«самым важным графическим улучшением с момента Core Animation
🟢Отлично подходит для визуальных спецэффектов, кастомных макетов, игр, интерактивной графики — без ухода в UIKit/Metal

Canvas { context, size in
context.fill(
Path(ellipseIn: CGRect(origin: .zero, size: size)),
with: .color(.green))
}


Canvas открывает новую эру для SwiftUI — графика, которую раньше надо было «обходить», теперь доступна в декларативном стиле. Если хотите сделать приложение с визуальной выразительностью — Canvas точно стоит попробовать!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1121
🐥 Безопасные уведомления в Swift Concurrency: MainActorMessage и AsyncMessage
Стандартные уведомления через NotificationCenter не учитывают модель конкурентности и изоляцию акторов.
🔴Даже если вы подписываетесь на уведомление с очередью .main, компилятор может выдавать предупреждения при вызове методов, атрибутированных @MainActor.
🔴Уведомления часто передаются через notification.object as? Type, что небезопасно и не даёт строгой типизации.

Использование новых протоколов MainActorMessage и AsyncMessage, доступных с iOS 26+, которые обеспечивают безопасную передачу уведомлений в модели Swift Concurrency решает эту проблему
🟢MainActorMessage: уведомление чётко связано с глав­ным актором — наблюдатель вызывается на главном акторе.
🟢AsyncMessage: уведомление может быть опубликовано из любого изоляционного контекста (любой актор или не-актор), и наблюдатель получает его асинхронно.

Пример:
//  1. Определение уведомления:
struct RecentBuildsChangedMessage: NotificationCenter.AsyncMessage {
typealias Subject = [RecentBuild]
let recentBuilds: Subject
}
// 2. Отправка сообщения
let message = RecentBuildsChangedMessage(recentBuilds: builds)
NotificationCenter.default.post(message)
// 3. Подписка на сообщения
token = NotificationCenter.default.addObserver(of: [RecentBuild].self, for: .recentBuildsChanged) { message in
self.handleNewRecentBuilds(message.recentBuilds)
}


➡️ Получаете: строгую типизацию, безопасность акторов, меньше бойлерплейта. Новые API дают гарантию изоляции и безопасного взаимодействия с актор-моделью. Если вы ещё используете старые методы — сейчас самое время обновиться.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
🔨 Трекинг тренировок с HealthKit на iPhone без Apple Watch
HealthKit очень мощный фреймворк, который был не популярен среди разработчиков из-за ограниченности аудитории. Раньше приложением здоровья на iPhone можно было пользоваться очень ограниченно и пользы в интеграции с ним было мало. Все поменялось с выпуском iOS 26 и новых API. Теперь возможно реализовать полнофункциональное приложение для отслеживания тренировок на iPhone/iPad.

С iOS 26 теперь у нас есть:
🟢Возможность начать и завершить тренировочную сессию (HKWorkoutSession) на iPhone/iPad.
🟢В реальном времени отслеживать такие метрики, как пульс, сожжённые калории, дистанция.
🟢Сохранять данные тренировок в HealthKit, чтобы они были доступны другим приложениям.

Давайте разбираться!
🔵Тренировкой управляют четыре основных объекта: HKWorkoutConfiguration, HKWorkoutSession, HKLiveWorkoutBuilder, HKLiveWorkoutDataSource
🔵Создайте конфигурацию тренировки с типом активности и местоположением.
🔵Инициализируйте тренировку с помощью health store и установите делегата.
🔵Получите конструктор тренировок и подключите источник данных.
🔵Сохраните ссылки на сеанс и конструктор, подготовьте датчики и покажите обратный отсчет.
🔵Запишите время начала и начните сбор данных, обновите состояние до активного и запустите таймер.
🔵Сохраните данные о тренировке в HealthKit

Пример полной интеграции с API и создания интерфейса при помощи SwiftUI есть в статье.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
🐥 Улучшенное автодополнение в Swift: новая ступень в развитии IDE
В рамках программы Google Summer of Code 2025 для проекта SourceKit-LSP реализовано значительное улучшение автодополнения и подсказок в IDE-средах, поддерживающих Swift.
🔵Раньше автодополнение показывало лишь краткое описание (первый абзац доккомментария) для элемента кода. Теперь поддерживается отображение полного документационного комментария прямо в списке предложений.
🔵Добавлена поддержка запроса signature help (подсказка сигнатуры функции/метода): отображаются все перегрузки и их описание.
🔵Эти улучшения применимы не только в Xcode: редакторы, поддерживающие LSP (например, Visual Studio Code, Neovim, IntelliJ IDEA) получают аналогичные преимущества.

Почему это важно для нас?
🟢Более богатые подсказки в коде значительно ускоряют процесс разработки: меньше «гугления», проще разобраться в API и перегрузках.
🟢Улучшает качество кода: с полной документацией и подсказками вы реже пропустите важную деталь метода или неверную перегрузку.
🟢Подходит для фреймворков, где много перегрузок, а документация длинная — например, SwiftUI, Combine, HealthKit
🟢Работает в редакторах, где ранее поддержка Swift была ограничена — расширяет выбор инструментов IDE для разработчика.
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍82🔥21
Демонстрация:​ Как интегрировать новый язык дизайна в приложения
Вчера прошла "встреча с Apple" ключевой темой которой являлся новый дизайн и жидкое стекло. Мои хайлайты из 2-часового доклада:
🔵Жидкое стекло становится частью фундаментальной системы дизайна Apple.
🔵Интерактивность жидкого стекла представляет собой огромный скачок в программных и графических технологиях.
🔵Акцент на содержании приложений и улучшение иерархии пользовательского интерфейса.
🔵Пользовательский интерфейс должен быть легко доступен и элегантно отходить на второй план.
🔵Три урока, усвоенные при перестройке приложения с помощью SwiftUI: начните с малого, работайте умнее, а не усерднее, завоевывайте доверие.
🔵Требуется дизайн система, где дизайн и код работают в гармонии.
🔵Переписывание приложения на SwiftUI облегчает переход на Liquid glass
🔵Liquid Glass помогает интерфейсу отойти на второй план, позволяя контенту сиять.

Опыт команды дизайнеров Apple:
🟢Цель проекта — создать единый язык дизайна для всех продуктов Apple.
🟢Мотивация: улучшение эргономичности и удобства использования.
🟢Десятки эскизов и прототипов помогают находить лучшие решения.
🟢Преимущества имеют нативные компоненты для создания интерфейсов
🟢Liquid Glass уменьшает количество цветов в кнопках, позволяя контенту быть хорошо видимым
🟢Поиск перемещён с верхней части iPhone на нижнюю для большей доступности.
🟢Сворачивание панели вкладок позволяет сфокусироваться на контенте.
🟢Иконки приложений формируют первое впечатление о приложении.
🟢Жидкое стекло создаёт единый визуальный язык для иконок.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍2
🐥 Усовершенствования Swift 6.3 для Embedded Swift
В версии Swift 6.3 идут значительные улучшения для Embedded Swift — версия Swift, оптимизированная под крайне ограниченные среды
Ключевые обновления:
🟢Метод denoscription/debugDenoscription для Float, Double теперь доступен в библиотеке Embedded Swift
🟢Появились диагностические предупреждения (EmbeddedRestrictions), которые помогают выявлять конструкции языка, неподходящие для Embedded-режима (например, untyped throws, применение generic-функций к existential)
🟢Улучшена взаимосвязь с C: поддержка атрибута @c, улучшена терпимость к несоответствиям между C-подписью и Swift-объявлением
🟢Отладка: улучшена работа с LLDB — появилась поддержка чтения памяти с указанием типа, улучшенная трассировка исключений на armv7m
🟢Линковка: устранена типовая проблема с дублированием символов при использовании Embedded Swift библиотек через слабые (weak) определения; введён атрибут @export

Даже если вы разрабатываете исключительно под iOS, полезно знать о развитии языка: улучшенная C-совместимость, диагностика, отладка — всё это может пригодиться. Swift 6.3 продолжает расширять возможности встроенного (embedded) варианта языка — теперь он становится не просто экспериментом, а более полноценной средой для разработки лёгких и эффективных решений.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
📱 MagnifyGesture в SwiftUI
Зумирование контента — привычное действие для пользователей. С помощью MagnifyGesture с iOS 17 в SwiftUI можно легко добавить такой жест к View:
🔴При использовании стандартных жестов зумирования возникают нюансы: нужно решить, будет ли увеличенное состояние "временным" (возврат к исходному после окончания жеста) или "сохраняемым" (пользователь может масштабировать и остаться на этом уровне)
🔴Без правильной настройки жеста и состояния пользовательский опыт будет непредсказуемым

Вариант 1: Временный зум
🟣Используйте @GestureState для хранения текущего коэффициента масштабирования:
🟣Примените .scaleEffect(magnification) к View и добавьте жест
🟣Итог: во время жеста View масштабируется, после окончания жеста возвращается к исходному состоянию.

  @GestureState private var magnification: CGFloat = 1

.gesture(
MagnifyGesture()
.updating($magnification) { value, state, _ in
state = value.magnification
}
)


Вариант 2: Сохраняемый зум
🟣Используйте два свойства:
🟣Применяйте .scaleEffect(totalMagnification * currentMagnification) и жест
🟣Итог: пользователь увеличивает View — и масштаб остаётся на этом уровне до следующего жеста.
  @State private var totalMagnification: CGFloat = 1.0
@State private var currentMagnification: CGFloat = 1.0

.gesture(
MagnifyGesture()
.onChanged { value in
currentMagnification = value.magnification
}
.onEnded { value in
totalMagnification *= value.magnification
currentMagnification = 1.0
}
)


Что важно:
Убедитесь, что целевые устройства поддерживают iOS 17+, чтобы использовать MagnifyGesture
Решите заранее: нужен ли вам зум постоянный или временный — архитектура жеста зависит от этого
При сохраняемом зуме обязательно работайте с двумя состояниями (текущим и накопленным), чтобы обеспечить плавный UX и корректные вычисления
Проверьте интерфейс: масштабирование влияет на расположение, обрезку, может потребоваться дополнительная логика для предотвращения слишком малого или слишком большого масштаба
Тестируйте на разных устройствах (iPhone, iPad), ориентациях и с разными контентами (изображения, списки, кастомные Views) — чтобы жест не конфликтовал с другими жестами (например, прокруткой)

Добавление зума через MagnifyGesture в SwiftUI — мощный инструмент для повышения интерактивности интерфейса. Главное — выбрать правильную стратегию и грамотно реализовать состояние.
Please open Telegram to view this post
VIEW IN TELEGRAM
1
📱 Когда GeometryReader не нужен
Использование GeometryReader для управления layout-разметкой может усложнить и сделать более тяжелой иерархию View. Часто, чтобы центрировать контент или задать максимальную ширину (например, для iPad), разработчики оборачивают всё в GeometryReader, вычисляют размеры — но это влияет на layout, вызывает лишние пересчёты, усложняет структуру. Правильным решением в этом кейсе является использование onGeometryChange + contentMargins (iOS 17+ с бекпортом до iOS 16)
🔵onGeometryChange даёт возможность реагировать на изменение геометрии контейнера — без необходимости оборачивать интерфейс в GeometryReader
🔵Вместе с contentMargins можно задавать отступы для scroll-контента, центрировать и ограничивать ширину — делая layout адаптивным и чистым

Практические плюсы для iOS разработчика:
🟢Более лёгкая и чистая иерархия View — без лишних вложений.
🟢Упрощённая адаптивная верстка: удобнее для iPad, разных размеров экранов, responsive-дизайна.
🟢Код легче поддерживать и читать — сокращается boilerplate, меньше хитростей.
🟢Можно контролировать layout декларативно, оставаясь в духе SwiftUI.

Что стоит проверить прямо сейчас:
Проверьте части UI, где сейчас используете GeometryReader просто ради вычисления ширины/центрирования. Возможно, его можно заменить на onGeometryChange + contentMargins
Для scrollable-экранов с ограниченной шириной (галереи, карточки, формы) — попробуйте contentMargins + ограничение max-width, чтобы красиво центрировать контент на широких экранах
Если нужна реакция на изменение размеров контейнера — onGeometryChange позволяет элегантно отлавливать это и обновлять layout без лишней обёртки
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🔨 CS193P 2025
Вышел обновленный стендфорский курс CS193p. Это бесплатный курс посвященный разработке приложений для iOS, объясняет основы создания приложений для iPhone и iPad с помощью SwiftUI. Почему культовый? В 2012 году я сам по нему учился и всю свою карьеру встречаю множество талантлевых iOS разработчиков, которые так же начали карьеру с него. На сайте представлены материалы, которые были доступны студентам Стэнфорда - записи домашних заданий и демонстрационный код.
🟢Курс на английском. От себя советую включать субтитры и слушать в оригинале, привыкать к международной терминологии
🟢Сам курс очень базовый и его можно начать изучать без знаний в iOS разработке, но база по программированию и ООП обязательна
🟢Между лекций есть домашние задания, их выполнение обязательно для полного погружения, если у вас появятся сложности, пишите в комментарии к этому посту-постараюсь помочь
🟢Если вы уже знакомы с iOS разработкой но сам курс не проходили - крайне советую пройти для систематизации ваших знаний

Пока вышли первые 6 лекций, но скоро должны появиться еще 9-10 лекций. Появилась идея сделать обзор лекций в канале @ios_broadcast, если вам такой формат интересен, ставьте 🔥
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥429
Привет, хочу поделиться классным каналом, который и сам читаю, про iOS разработку и мобильную разработку в целом.

Ребята делятся только полезными гайдами, важными статьями, примерами кода, новостями и многим другим.

👉 Подписывайтесь на @hardworkerIT
8👍4🤔21
🔨 CS193P Лекция 1
Обычная вводная лекция, о курсе, требования для прохождения курса и знакомство со всем необходимым набором возможностей Xcode. Самая интересная часть 1 лекции это домашнее задание, до 4 лекции от студентов Stanford требуется изучить основы Swift:

Цветовая кодировка разделов
🔘Серые темы не нужно читать сейчас
🟡Желтые темы необычны и требуют внимания
🔴Красные темы важны и требуют внимательного прочтения

Материалы к прочтению:
🟢Swift Tour
🟢Swift API Guidelines
🟢Swift Basics

Мои хайлдайты из плана для чтения:
🟢Словарь и массив являются мощными и часто используемыми структурами. Освойте их как можно раньше
Разобраться в разнице между let и var
🟢Функции являются типами первого рода в Swift (first-class citizens). Это означает, что их можно использовать как и любые другие типы данных
🟢Замыкания (Closure) более мощные, чем встроенные функции - являются ссылочными типами
🟢Перечисления важны в Swift
🟢Структуры являются value-type, классы - ссылочными типами
🟢Методы экземпляра, свойство self, изменение типов значений из методов экземпляра

Получил достаточно много 🔥в реакциях, так что введу разбор одной лекции в неделю. Тем кто хочет погрузиться в iOS разработку-предлагаю за эту неделю смотреть саму лекцию и задавать вопросы по домашнему заданию прямо в комментарии к посту.
#cs193p
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍71