Telegram Web Link
Эвристика iOS постоянно совершенствуется, например, теперь мы можем обнаруживать деньги и не только с помощью новых детекторов данных.

🛠 Если с .money всё понятно, то .physicalValue пока что без описания.

@iOS Dev
Теперь можно изменять размер для sheetPresentation!

😉 Например, если вам нужен участок, который сейчас имеет высоту всего 250 пунктов, это легко сделать с помощью кода выше.

Когда вы создаёте свой detent provider, можно использовать UISheetPresentationControllerDetentResolutionContext, чтобы увидеть, например, trait collection или установить максимальное значение.

🎉 Неплохо! Кроме этого, можно использовать и прошлые свойства UISheetPresentationController, как установка, например, .largestUndimmedDetentIdentIdentifier.

@iOS Dev
Как добавить автоматическое изменение размера ячеек UICollectionView или UITableView в iOS 16

😎 Изменение, которое наверняка заставит тех из нас, кто годами полагался на UICollectionView и UITableView, плакать от радости и облегчения (как заметил Джордан Морган, написавший одним из первых про эту фичу), теперь автоматически управляет размером ячеек при изменении их содержимого.

ℹ️ Обратите внимание, речь идёт именно про изменение размера (у нас уже давно были self sizing cells).

А теперь, например, если у вас есть лейбл, который то прячется, то вновь показывается, больше не нужно выполнять магические заклинания, чтобы изменить размер ячейки, вычислить ее высоту или что-то еще — теперь это доступно прямо из коробки.

📝 И ещё кое-что, это свойство теперь включено по умолчанию.

@iOS Dev
SF-символы получили ещё один веский повод посмотреть на них под другим углом

С каждым годом они становятся сложнее и полезнее. Даже если бы нам каждый год добавляли больше символов, это уже было бы неплохо 😉.

Буквально вчера я уже писал про то, что в Apple упростили их интеграцию в наши приложения. Но это не всё!

В Apple ищут способы для расширения возможностей многих вещей и добавления новых фреймворков. И сразу после того, как нам предоставили разные стили рендеринга символов, появилась возможность ещё и по-разному их заполнять.

Короче говоря, мы можем «заполнить» глиф на основе процентного значения от 0 до 1. Примеры использования, о которых можно подумать сразу:

1️⃣ Прогресс загрузки или обновления.

2️⃣ Сила сигнала Wi-Fi.

3️⃣ Заряд вашего телефона (и не только его).

4️⃣ Размер волн на море (простите, лето).

😎 В общем, примеров использования этого простого улучшения может быть много, и здорово, что символы постоянно прокачивают.

@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Упрощаем написание и понимание кода в Swift 5.7 использованием some

В своем канале постараюсь приводить самые занятные моменты сессий в виде небольших постов с разбором.

На гифке объявление идентично предыдущему, но ненужный список параметров типа и where исчезли, потому что нам не всегда нужна выразительность, которую они обеспечивают.

Запись some Animal более понятна, поскольку уменьшает синтаксический шум и включает семантическую информацию о параметре animal прямо в объявление параметра.

Немного про синтаксис some Animal

1️⃣ Слово some указывает на то, что вы работаете с определенным типом.

2️⃣ За ключевым словом some всегда следует требование соответствия.

3️⃣ В данном случае конкретный тип должен соответствовать протоколу Animal, что позволит нам использовать требования протокола Animal для значения параметра.

4️⃣ Ключевое слово some можно использовать в типах параметров и результатов.

😉 Если вы уже писали код SwiftUI, вы использовали some. Some View несёт точно такой же смысл.

@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Xcode 14 научили добавлять отступы при вводе закрывающей скобки

😎По факту, это аналог команды Ctrl + i. Она же находится в Editor -> Structure -> Re-Indent.

@iOS Dev
Создание и настройка диаграмм с помощью нового Swift Charts Framework

💻 Уже появляются статьи и туториалы, связанные с анонсами #WWDC, по мере сил делюсь с вами этими материалами в доступных форматах.

📖 Адаптировал и запилил на хабре урок про создание и настройку диаграммы со слоями.

📖 Для тех, кто предпочитает читать в телеге — то же самое, доступно тут.

🛠 Базовый материал можно прочесть здесь, а код, по традиции, на гитхабе.

@iOS Dev
Как с помощью Gauge в iOS 16 показать значение в заданном диапазоне

👨‍💻 Часто бывает так, что вы хотите отобразить прогресс чего-то происходящего в вашем приложении, например, в отображающем список книг, и хотите показать прогресс чтения.

В SwiftUI для этого можно использовать Gauge View (подробнее в документации).

🙌 Кроме этого, вы можете дополнительно стилизовать внешний вид индикатора, задав цвет оттенка или градиент в инициализаторе. На картинке показан эффект градиента с CircularGaugeStyle.

@iOS Dev
WWDC: Навигация по блокам видео

#WWDC подошла к концу, и пусть мы некоторые нововведения уже расмотрели, но их, конечно же, намного больше.

Позволил себе вынести в отдельный блок приоритетные темы для изучения.

📼 Лучшее в Swift: последние обновления.
📼 Инструменты разработчика: все, что нужно для создания следующего топового приложения.
📼 System Services.
📼 Карты.
📼 SwiftUI и Frameworks.
📼 Privacy и Security.

Остальные видео, сгруппированые по блокам, доступны по следующим ссылкам:

📼 Доступность и инклюзивность.
📼 Изменения в App Services: App Intents, SharePlay, WidgetKit, Focus, и другие.
📼 Лучшее из App Store Distribution и Marketing.
📼 Аудио и видео.
📼 Дополненная реальность.
📼 Бизнес и образование.
📼 Улучшения в дизайне: узнайте, как придумывать, повторять и создавать отличные интерфейсы.
📼 Графика и игры: повысьте уровень своих приложений и игр с помощью Metal 3.
📼 Здоровье и фитнес.
📼 ML и Vision.
📼 Фото и камера.
📼 Safari и Web.

❤️ Сделал для читателей @iOS Dev.
Как использовать Live Text API в вашем приложении для iOS

С iOS 16 функция Live Text стала доступна для разработчиков. Однако в Xcode 14 вы не найдете ни LiveTextKit, ни фреймворка с подобным названием. Всё дело в том, что новые API являются частью фреймворка VisionKit.

ℹ️ И вообще, Live Text — это скорее маркетинговый термин. Классы, которые нужно использовать, это ImageAnalyzer и ImageAnalysisInteraction.

Базовая настройка по на деле не очень сложная. Нам нужен UIImageView для отображения overlay и экземпляр UIImage с каким-нибудь изображением, содержащим либо текст, либо, например QR-код.

📖 В своей статье Filip Němeček приводит пример работы этих API.

📼 Перед этим можно посмотреть видео с #WWDC или почитать документацию.

@iOS Dev
Пример создания CircleLayout в SwiftUI

❗️Внимание! Эта возможность официально не документирована (или спрятана, как другие Private API) и пока непонятно, как будут относиться в Apple на ревью. Я не рекомендую использовать это в ваших проектах на данный момент.

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

Если кто-то из вас, коллеги, делал приложения для WatchOS, то возможно вы проходили через некоторые сложности анимаций. Мне этот CircleLayout напомнил анимацию для часов, страшно даже сказать вслух, с #WWDC 2015.

Верю, что этот тип layout рано или поздно всё-таки анонсируют, так как, например, для часов мы уже видели улучшения.

@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Xcode 14 научили сохранять значение параметра при автокомплите вместо добавления нового

🎉 Одна из самых неприятных вещей в среде разработки была побеждена. Если раньше при автокомплите сохранялся старый код с уже заданным параметром и добавлялся новый слева, то теперь в Apple это оптимизировали и сэкономили всем нам немного нервов при разработке.

Надеюсь, что инициаторы этой фичи в Xcode получили свою заслуженную премию 😉.

@iOS Dev
Реализация собственного календаря с использованием UICalendarView на Swift в iOS 16

👏 Написал небольшую статью про то, как быстро можно внедрить новый UICalendarView в ваше приложение на Swift, в котором будет новая ось.

😉 Пример кода тоже есть, иначе зачем это всё.

@iOS Dev
Различные методы удаления последнего элемента из массива в Swift

1️⃣ dropLast()

let fruits = ["Apple","Orange","Banana"]
let nonRoundFruits = fruits.dropLast()
print(nonRoundFruits) // ["Apple", "Orange"]


Использование метода dropLast() удалит последний элемент и вернет оставшиеся. dropLast() является предпочтительным методом удаления массива, поскольку он безопасен, так как не изменяет исходный массив.

2️⃣ removeLast()

var fruits = ["Apple","Orange","Banana"]
let removedFruit = fruits.removeLast()
print(fruits) // ["Apple", "Orange"]
print(removedFruit) // Banana


В отличие от метода dropLast(), метод removeLast() удаляет последний элемент из исходного массива и модифицирует его.

3️⃣ popLast()

var fruits = ["Apple","Orange","Banana"]
let removedFruit = fruits.popLast()
print(fruits) // ["Apple", "Orange"]
print(removedFruit) // Optional("Banana")


🧐 PopLast() похож на прошлый, но есть разница. Если в массиве нет элементов перед вызовом popLast(), краша не будет. Вместо этого вернётся nil.

@iOS Dev
Улучшение работы с closures в Swift 5.7

Раньше Swift действительно боролся с любыми замыканиями, которые не были тривиальными, но начиная с Swift 5.7 мы теперь можем писать код, как в первом примере.

😎 В новой версии было принято предложение SE-0326. Это сделало вывод типов менее неожиданным для разработчиков и устранило существующую ошибку в поведении.

👌 Речь здесь идёт о том, что добавление еще одного выражения или оператора в closure могло приводить к ошибке компиляции. Теперь такого не будет, и это хорошо.

@iOS Dev
WWDC: Вопросы и ответы из Digital Lounges

В некоторых источниках уже фигурировали ответы по SwiftUI, собранные из каналов Slack по итогам общения разработчиков с работниками Apple.

📖 Пользователь твиттера по имени Emin пошёл дальше и создал ресурс со всеми темами из Digital Lounges.

👏 Из плюсов — хороший поиск и степень структурирования, а также потенциальное масштабирование.

🛠 Также вы можете внести и свой вклад в опенсорсный проект на гитхабе.

@iOS Dev
Паттерн «Навигатор»: изучаем и осваиваем NavigationStack в SwiftUI 👨‍💻

SwiftUI — это декларативный фреймворк, позволяющий нам создавать сложные пользовательские интерфейсы, определяя данные, отображаемые на экране.

🧭 Навигация была главной больной точкой фреймворка с самого первого дня. К счастью, после #WWDC22 ситуация изменилась, и SwiftUI теперь предоставляет новый API навигации на основе данных.

📖 В этом материале можно узнать, как использовать новый Navigation API для построения
user flow — пути, которым могут воспользоваться пользователи внутри приложения.

@iOS Dev
Как сбросить UserDefaults в Swift?

👌 Мы можем использовать UserDefaults в наших приложениях для хранения некоторых базовых конфигураций или настроек приложения.

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

🤔 Мы можем использовать метод removeObject, чтобы удалить значение для определенного ключа (и сделать так для каждого).

🛠 Но что делать, если таких ключей у нас пара десятков? Тогда на помощь придёт системное API, в котором пригодится removePersistantDomainForName.

@iOS Dev
Grand Central Dispatch: многопоточность, очереди, параллелизм

Grand Central Dispatch (GCD) - это низкоуровневый API для управления параллельными операциями. Он может помочь улучшить скорость отклика вашего приложения, откладывая вычислительно дорогие задачи на задний план. Это более простая в работе модель, нежели блокировки и потоки.

📖 В этом материале по Grand Central Dispatch, состоящем из двух частей, вы узнаете все тонкости GCD и его Swifty API.

В первой части объясняется, что делает GCD, и демонстрируется несколько основных функций GCD.

Во второй части вы узнаете о некоторых расширенных функциях GCD.

Вы будете работать над существующим приложением под названием GooglyPuff. GooglyPuff - это неоптимизированное, "потокобезопасное" приложение, которое накладывает «гугл-глаза» на обнаруженные лица, используя API Core Image для обнаружения лиц.

🛠 В рамках этих статей GCD поможет оптимизировать приложение и обеспечить безопасный вызов кода из разных потоков.

@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Создание кастомного ParseableFormatStyle в iOS

Начиная с iOS 2.0, старый класс Formatter и его производные, такие как DateFormatter и NumberFormatter, были основным средством преобразования значений в строки и наоборот — из строк. С течением времени Apple добавила другие крутые форматеры, такие как ByteCountFormatter, MeasurementFormatter, RelativeDateTimeFormatter и ListFormatter.

📖 В этом посте рассматриваются развёрнутые возможности и приводятся примеры, как расширить ParseableFormatStyle и связанные с ним протоколы, чтобы создать собственный пользовательский форматер телефонных номеров. Затем его используют для фактического форматирования ввода текстовых полей.

🙌 И хотя в статье автор пишет про iOS, эти протоколы доступны в macOS, watchOS и tvOS.

@iOS Dev
2025/07/08 00:33:17
Back to Top
HTML Embed Code: