iOS Broadcast
3.31K subscribers
1.69K photos
84 videos
971 links
Подборка новостей и статей для iOS разработчиков.

Новости Kotlin и мультиплатформы @kotlin_broadcast
Новости Android @android_broadcast
Реклама и прочее @android_broadcast_bot
Download Telegram
Декларативный UI: определение, история и необходимость

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

#paradigms
👍8👎1
Регистрация аккаунта разработчика в Apple: что может пойти не так

История одной регистрации в Apple Developer Program, которая вместо двух недель затянулась на 3 месяца.

Бизнес-аналитик, который работал с этими задачами, дает пару практических советов:
👉 Получать D-U-N-S (ID компании для регистрации) лучше сразу через Apple
👉 Будет эффективнее не писать обращения в Apple, а заказывать обратные звонки. В телефонном разговоре проще решать все вопросы здесь и сейчас, а не ждать каждый раз ответа несколько дней

#apple
👍3👎1
Speech Synthesis: Text To Speech in SwiftUI

Apple предоставляет библиотеку для синтеза речи во фреймворке AVFoundation. Реализовать можно с помощью двух классов AVSpeechUtterance and AVSpeechSynthesizer. Довольно просто 😎

#swift
👍17👎2
Window management in SwiftUI

В текущей итерации SwiftUI значительным изменением стало добавление API для управления окнами. Что нового:
👉 Поддержка нескольких окон проверяется с помощью переменной окружения @Environment(\.supportsMultipleWindows)
👉 Создание новое окно с помощью Window
👉 Создание группы с помощью WindowGroup
👉 Модицифицирование стиля с помощью windowStyle
👉 Создание menu bar app

#swiftUI
👍7👎1
What is a Tuple in Swift?

Tuples предоставляют способ сгруппировать несколько значений вместе, чтобы представить их как единое. В статье представлена подробная информация о Tuple.

Что важно помнить:
👉 Empty tuple - () или всем знакомый Void
👉 Tuple как Type alias: typealias PersonTuple = (String, Int)
👉  Tuple - типы значений, а значит при переприсвании они копируются
👉 Количество элементов в tuple можно узнать так: Mirror(reflecting: tuple).children.count

#swift
🔥5👎1
3 Agile Principles for a Productive and Progressive Life (with Examples!)

А что если применить правила Agile в повседневной жизни?🤔
В статье примеры из жизни и 3️⃣ основных правила:
👉 Планирование путем разбиения большой задачи на более мелкие задачи
👉 Если задача вошла в планирование, то другая должна выйти
👉 Если задача была просрочена, то обязательно нужно проанализировать почему именно она была сделана не в срок

#оффтоп
👍6👎1
Routing in SwiftUI

В статье представлены 2 вида routing’a в приложениях на SwiftUI:
1. Router With Trigger Views
Способ основан на маршрутизаторе, который возвращает вложенные экраны для всех возможных навигационных маршрутов. Такой фрагмент кода экрана или View будет содержать внутри модификатор NavigationLink или .sheet. Маршрутизатор запоминает открытый флоу благодаря биндингу @state. Показанные экраны не зависят от кода навигации и места назначения, только от протокола маршрутизатора

2. Router with type-erased modifiers
Экраны хранят @state маршрутизатора, который отслеживает текущее флоу, и выполняют навигацию, когда маршрутизатор изменит это состояние

#swiftUI
👍4👎1
Dependency Injection in Swift 5

UPD: О том, как реализовать DI с использованием Swift 5

Property wrapper'ы, которое упрощают Dependency Injection с помощью атрибута @Injected.
DI помогает писать менее связанный код без передачи параметров вручную, абстрагироваться от инициализации зависимостей и упростить тестирование

#swift
🔥6👎5👍1
The Chain of Responsibility Pattern in Swift (2 мин)

Цепочка ответчиков реализует возможность обработать запрос нескольким объектом. Отличным примером является концепция responder'ов.

UIKit запускается с элемента управления first responder, который активировал клавиатуру, а затем передает вызов вверх по цепочке до тех пор, пока компонент не сможет выполнить действие.

Шаблон цепочки ответчиков используется для достижения слабой связи при разработке программного обеспечения.

#patterns
🔥5👍2👎2
Make swift ‘contains()’ and ‘filter()’ ready for iOS Development

Полезные расширения для поиска строк в массиве:
👉 partiallyContains() / partiallyContainsFilter() для поиска по части строки в массиве строк (‘arr’ в [‘array’])
👉 relaxedOrderContains() / relaxedOrderFilter()
для, например, ‘world hello’ on [“hello world”]
👉 flexibleFilter() для реализации "поиска по контактам", например "wo" в ["world", "hello world"]

#swift
🔥7👎2
Как Xcode 14 непреднамеренно увеличивает размер приложения

Среди других функций Xcode 14 по умолчанию отключил биткод - альтернативный способ упаковки приложения, при котором часть процесса сборки остается на стороне Apple после его отправки в App Store.
Простое объяснение заключается в том, что битовый код оптимизирует производственные сборки, частично за счет удаления двоичных символов. Без включения битового кода настройки сборки Xcode необходимо изменить, чтобы удалять двоичные символы.

Как удалить двоичные символы без биткода:
👉 Используя настройки сборки Xcode
👉 Используя скрипт

#xcode
👍6
Как настроить Charles

Приложение Charles Proxy - большой помощник и тестировщику, и разработчику. Для меня бывает особенно полезно, когда нужно подменить данные с бэка или подебажить приложение. Об установке, настройке и интерфейсе читайте в статье

#tools
👍8
Как устроено приложение Календарь в iPhone

Разбор реализации календаря. Навигация, экраны, Accessibility

#iOS
👍9👎1
Обзор новых API навигации в SwiftUI

SwiftUI имеет новые API-интерфейсы навигации в iOS 16 и macOS 13 на основе стека и по нескольким столбцам:
👉 NavigationStack состоит из корневого вью, у которого могут быть дополнительные вью, “накладываемые” поверх него, тем самым создавая стек. Обычно используем для приложений, работающих на iPhone
👉 Программная навигация в NavigationStack. Создаем переменную State, содержащую путь навигации, и передаем привязку к ней в NavigationStack
👉 NavigationSplitView. Обычно это боковая панель слева, где пользователь может выбирать элементы, которые будут отображаться в подробном виде справа. Используем для iPad или Mac
👉 NavigationSplitView с тремя колонками

#swiftUI
👍5👎1
Жизненный цикл UIViewController

Вспомним и закрепим еще раз с наглядной схемой:
👉 init
👉 loadView - создание view
👉 viewDidLoad - viewController создан, Outlets на месте
👉 viewWillAppear - view будет добавлено в иерархию отображения
👉 viewWillLayoutSubViews - каждый раз, когда изменяется frame
👉 viewDidLayoutSubviews - view только что разместило свои subview
👉 viewDidAppear - после того, как ViewController появляется на экране
👉 viewWillDisappear - до того, как viewController будет удален с экрана
👉viewDidDisappear - после удаления viewController'a с экрана
👉 deinit

#ui
🔥19👎2👍1
Bottom sheet: Navigation

В статье описано, как создать полноценную навигацию в рамках bottom sheet отображения, основанного на autolayout, а не на неудобном ручном расчёте высоты. Повторили анимации навигационных переходов. Добавили navigation bar как нативный способ управления навигацией.

#ui
👍10👎2
Apple ускоряет разработку гарнитуры смешанной реальности

По словам Bloomberg, компания планирует представить гарнитуру уже в следующем году вместе со специальной операционной системой и магазином приложений.
Ожидается, что его первое устройство в этой области будет намного дороже, чем существующие основные конкуренты, и будет включать в себя экраны сверхвысокого разрешения для виртуальной реальности и несколько внешних камер для обработки элементов дополненной реальности. Оно также будет иметь возможности отслеживания рук и работать на процессоре на базе чипа M2 — компонента, представленного в последних компьютерах Mac компании.

#слухи
🔥7👎2🤔2😱1
Делаем плавный скролл в нагруженных таблицах

Способы оптимизации таблицы, рассмотренные в статье:
👉 Повторное использование ячеек/хедеров и футеров — первый и важный шаг оптимизации
👉 Уменьшить общее время загрузки и вычислений, их перевод в Background-очереди — значит упростить объем подсчетов
👉 Использование стандартных компонентов Core Animation для отрисовки ячеек позволит существенно ускорить процесс отображения и повысить производительность
👉 Кеширование данных для ячеек
👉 Нет ничего плохого в комбинации Auto Layout и ручного подсчета. Там, где не хватает производительности — использовать ручной подсчет

#optimization
👍93👎2🤔1😢1
The Ultimate How-to: Build a Bluetooth Swift App With Hardware in 20 Minutes

👉 Добавляем 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 вместо hidesBottomBarWhenPushedtabbar.isHidden или tabbar.frame
👉 Управление показом/скрытием в одном месте. MainTabBarNavigationManager: UINavigationControllerDelegate и задать его делегатом для всех navigation controller'ов

#ui
👍4👎1