This media is not supported in your browser
VIEW IN TELEGRAM
Xcode 14 научили добавлять отступы при вводе закрывающей скобки
😎По факту, это аналог команды
@iOS Dev
😎По факту, это аналог команды
Ctrl + i
. Она же находится в Editor -> Structure -> Re-Indent.@iOS Dev
Создание и настройка диаграмм с помощью нового Swift Charts Framework
💻 Уже появляются статьи и туториалы, связанные с анонсами #WWDC, по мере сил делюсь с вами этими материалами в доступных форматах.
📖 Адаптировал и запилил на хабре урок про создание и настройку диаграммы со слоями.
📖 Для тех, кто предпочитает читать в телеге — то же самое, доступно тут.
🛠 Базовый материал можно прочесть здесь, а код, по традиции, на гитхабе.
@iOS Dev
💻 Уже появляются статьи и туториалы, связанные с анонсами #WWDC, по мере сил делюсь с вами этими материалами в доступных форматах.
📖 Адаптировал и запилил на хабре урок про создание и настройку диаграммы со слоями.
📖 Для тех, кто предпочитает читать в телеге — то же самое, доступно тут.
🛠 Базовый материал можно прочесть здесь, а код, по традиции, на гитхабе.
@iOS Dev
Как с помощью Gauge в iOS 16 показать значение в заданном диапазоне
👨💻 Часто бывает так, что вы хотите отобразить прогресс чего-то происходящего в вашем приложении, например, в отображающем список книг, и хотите показать прогресс чтения.
В SwiftUI для этого можно использовать
🙌 Кроме этого, вы можете дополнительно стилизовать внешний вид индикатора, задав цвет оттенка или градиент в инициализаторе. На картинке показан эффект градиента с
@iOS Dev
👨💻 Часто бывает так, что вы хотите отобразить прогресс чего-то происходящего в вашем приложении, например, в отображающем список книг, и хотите показать прогресс чтения.
В 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.
#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 — это скорее маркетинговый термин. Классы, которые нужно использовать, это
Базовая настройка по на деле не очень сложная. Нам нужен
📖 В своей статье Filip Němeček приводит пример работы этих API.
📼 Перед этим можно посмотреть видео с #WWDC или почитать документацию.
@iOS Dev
С 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 на ревью. Я не рекомендую использовать это в ваших проектах на данный момент.
😎 Оказывается, что кроме стандартных типов лэйаута есть
Если кто-то из вас, коллеги, делал приложения для WatchOS, то возможно вы проходили через некоторые сложности анимаций. Мне этот CircleLayout напомнил анимацию для часов, страшно даже сказать вслух, с #WWDC 2015.
⏳ Верю, что этот тип layout рано или поздно всё-таки анонсируют, так как, например, для часов мы уже видели улучшения.
@iOS Dev
❗️Внимание! Эта возможность официально не документирована (или спрятана, как другие 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
🎉 Одна из самых неприятных вещей в среде разработки была побеждена. Если раньше при автокомплите сохранялся старый код с уже заданным параметром и добавлялся новый слева, то теперь в Apple это оптимизировали и сэкономили всем нам немного нервов при разработке.
Надеюсь, что инициаторы этой фичи в Xcode получили свою заслуженную премию 😉.
@iOS Dev
Реализация собственного календаря с использованием UICalendarView на Swift в iOS 16
👏 Написал небольшую статью про то, как быстро можно внедрить новый UICalendarView в ваше приложение на Swift, в котором будет новая ось.
😉 Пример кода тоже есть, иначе зачем это всё.
@iOS Dev
👏 Написал небольшую статью про то, как быстро можно внедрить новый UICalendarView в ваше приложение на Swift, в котором будет новая ось.
😉 Пример кода тоже есть, иначе зачем это всё.
@iOS Dev
Telegraph
Реализация собственного календаря с использованием UICalendarView на Swift в iOS 16
Настройка UICalendarView UICalendarView принадлежит к фреймворку UIKit и поставляется с простым инициализатором. let calendarView = UICalendarView() let gregorianCalendar = Calendar(identifier: .gregorian) calendarView.calendar = gregorianCalendar Примечание.…
Различные методы удаления последнего элемента из массива в Swift
1️⃣ dropLast()
Использование метода dropLast() удалит последний элемент и вернет оставшиеся. dropLast() является предпочтительным методом удаления массива, поскольку он безопасен, так как не изменяет исходный массив.
2️⃣ removeLast()
В отличие от метода dropLast(), метод removeLast() удаляет последний элемент из исходного массива и модифицирует его.
3️⃣ popLast()
🧐 PopLast() похож на прошлый, но есть разница. Если в массиве нет элементов перед вызовом popLast(), краша не будет. Вместо этого вернётся nil.
@iOS Dev
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
⏳ Раньше Swift действительно боролся с любыми замыканиями, которые не были тривиальными, но начиная с Swift 5.7 мы теперь можем писать код, как в первом примере.
😎 В новой версии было принято предложение SE-0326. Это сделало вывод типов менее неожиданным для разработчиков и устранило существующую ошибку в поведении.
👌 Речь здесь идёт о том, что добавление еще одного выражения или оператора в closure могло приводить к ошибке компиляции. Теперь такого не будет, и это хорошо.
@iOS Dev
WWDC: Вопросы и ответы из Digital Lounges
В некоторых источниках уже фигурировали ответы по SwiftUI, собранные из каналов Slack по итогам общения разработчиков с работниками Apple.
📖 Пользователь твиттера по имени Emin пошёл дальше и создал ресурс со всеми темами из Digital Lounges.
👏 Из плюсов — хороший поиск и степень структурирования, а также потенциальное масштабирование.
🛠 Также вы можете внести и свой вклад в опенсорсный проект на гитхабе.
@iOS Dev
В некоторых источниках уже фигурировали ответы по SwiftUI, собранные из каналов Slack по итогам общения разработчиков с работниками Apple.
📖 Пользователь твиттера по имени Emin пошёл дальше и создал ресурс со всеми темами из Digital Lounges.
👏 Из плюсов — хороший поиск и степень структурирования, а также потенциальное масштабирование.
🛠 Также вы можете внести и свой вклад в опенсорсный проект на гитхабе.
@iOS Dev
Паттерн «Навигатор»: изучаем и осваиваем NavigationStack в SwiftUI 👨💻
SwiftUI — это декларативный фреймворк, позволяющий нам создавать сложные пользовательские интерфейсы, определяя данные, отображаемые на экране.
🧭 Навигация была главной больной точкой фреймворка с самого первого дня. К счастью, после #WWDC22 ситуация изменилась, и SwiftUI теперь предоставляет новый API навигации на основе данных.
📖 В этом материале можно узнать, как использовать новый Navigation API для построения
user flow — пути, которым могут воспользоваться пользователи внутри приложения.
@iOS Dev
SwiftUI — это декларативный фреймворк, позволяющий нам создавать сложные пользовательские интерфейсы, определяя данные, отображаемые на экране.
🧭 Навигация была главной больной точкой фреймворка с самого первого дня. К счастью, после #WWDC22 ситуация изменилась, и SwiftUI теперь предоставляет новый API навигации на основе данных.
📖 В этом материале можно узнать, как использовать новый Navigation API для построения
user flow — пути, которым могут воспользоваться пользователи внутри приложения.
@iOS Dev
Как сбросить UserDefaults в Swift?
👌 Мы можем использовать UserDefaults в наших приложениях для хранения некоторых базовых конфигураций или настроек приложения.
Вот только по мере усложнения проекта иногда нам может понадобится функция очистки всего конфига.
🤔 Мы можем использовать метод
🛠 Но что делать, если таких ключей у нас пара десятков? Тогда на помощь придёт системное API, в котором пригодится
@iOS Dev
👌 Мы можем использовать 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
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, старый класс
📖 В этом посте рассматриваются развёрнутые возможности и приводятся примеры, как расширить
🙌 И хотя в статье автор пишет про iOS, эти протоколы доступны в macOS, watchOS и tvOS.
@iOS Dev
⏳ Начиная с iOS 2.0, старый класс
Formatter
и его производные, такие как DateFormatter
и NumberFormatter
, были основным средством преобразования значений в строки и наоборот — из строк. С течением времени Apple добавила другие крутые форматеры, такие как ByteCountFormatter
, MeasurementFormatter
, RelativeDateTimeFormatter
и ListFormatter
. 📖 В этом посте рассматриваются развёрнутые возможности и приводятся примеры, как расширить
ParseableFormatStyle
и связанные с ним протоколы, чтобы создать собственный пользовательский форматер телефонных номеров. Затем его используют для фактического форматирования ввода текстовых полей. 🙌 И хотя в статье автор пишет про iOS, эти протоколы доступны в macOS, watchOS и tvOS.
@iOS Dev
DoNilDisturb Swift Plugin
😎 Важно не терять фокус во время выполнения задач, но знаете, иногда всем нам нужен отдых (особенно ближе к вечеру пятницы).
Решил поделиться с вами шуточным плагином, который не позволит вам билдить проекты в нерабочее время😂
Не у всех выходные в субботу и воскресенье, и не у всех рабочий день длится с 9 до 17 часов, но всё-таки!
Опенсорсный DoNilDisturb Swift Plugin (nil, ахахах, ну вы поняли) делает именно это — не даёт вам запустить ваш проект в нерабочее время.
Хороших вам выходных, iOS-разработчики❤️!
@iOS Dev
😎 Важно не терять фокус во время выполнения задач, но знаете, иногда всем нам нужен отдых (особенно ближе к вечеру пятницы).
Решил поделиться с вами шуточным плагином, который не позволит вам билдить проекты в нерабочее время😂
Не у всех выходные в субботу и воскресенье, и не у всех рабочий день длится с 9 до 17 часов, но всё-таки!
Опенсорсный DoNilDisturb Swift Plugin (nil, ахахах, ну вы поняли) делает именно это — не даёт вам запустить ваш проект в нерабочее время.
Хороших вам выходных, iOS-разработчики❤️!
@iOS Dev
iOS Responder Chain: UIResponder, UIEvent, UIControl и их использование
🤔 Что вообще за зверь такой, responder, если я имею дело с UITextFields?
🤔 Почему UIViews юзает сабкласс от UIResponder?
🤔 Вообще, в чем их смысл?
В iOS Responder Chain — это название, данное сгенерированному UIKit связному списку объектов UIResponder, и это основа для всего, что касается событий (touch, motion).
🛠 Responder Chain — это то, с чем мы постоянно встречаемся при разработке, и хотя не так часто приходится иметь с ней дело напрямую, пожалуй, кроме манипуляций с клавиатурой
Экземпляры UIResponder это объекты, которые могут обрабатывать и реагировать на произвольные события. Многие вещи в iOS являются UIResponder, включая
📖 В этом материале рассказывается про это детальнее, и приводятся примеры использования.
@iOS Dev
🤔 Что вообще за зверь такой, responder, если я имею дело с UITextFields?
🤔 Почему UIViews юзает сабкласс от UIResponder?
🤔 Вообще, в чем их смысл?
В iOS Responder Chain — это название, данное сгенерированному UIKit связному списку объектов UIResponder, и это основа для всего, что касается событий (touch, motion).
🛠 Responder Chain — это то, с чем мы постоянно встречаемся при разработке, и хотя не так часто приходится иметь с ней дело напрямую, пожалуй, кроме манипуляций с клавиатурой
UITextField
😉, знание того, как она работает, позволяет решать связанные с событиями проблемы простыми/креативными способами.Экземпляры UIResponder это объекты, которые могут обрабатывать и реагировать на произвольные события. Многие вещи в iOS являются UIResponder, включая
UIView
, UIViewController
, UIWindow
, UIApplication
и UIApplicationDelegate
.📖 В этом материале рассказывается про это детальнее, и приводятся примеры использования.
@iOS Dev
Быстрый способ проверить, все ли элементы коллекции удовлетворяют заданному условию
👌 Со Swift 4.2 для этого можно использовать метод
🟢 Если все элементы удовлетворяют заданному условию, то вызов
🔴Если хотя бы один элемент не пройдет наше условие, то результатом вызова
@iOS Dev
👌 Со Swift 4.2 для этого можно использовать метод
allSatisfy()
. 🟢 Если все элементы удовлетворяют заданному условию, то вызов
allSatisfy()
вернет true
.🔴Если хотя бы один элемент не пройдет наше условие, то результатом вызова
allSatisfy()
будет false
.@iOS Dev
This media is not supported in your browser
VIEW IN TELEGRAM
Быстрый способ проверить созданную URL-схему (диплинк) в симуляторе c помощью терминала
⏳ Есть старый способ с использованием Safari, но он не так эффективен. Safari не запоминает последнюю добавленную схему, поэтому вам придется вводить её снова и снова. А переход между браузером и приложением делает ситуацию хуже, ещё и тратит время.
👌 Расскажу о другом способе. Вы наверняка знаете, что есть xcrun, который можно использовать для запуска любого инструмента внутри Xcode из командной строки. Опцией для способа ниже является simctl, который и поможет вам управлять симуляторами.
Для этого можно использовать:
💻 В качестве параметра
Специально для @iOS Dev.
⏳ Есть старый способ с использованием Safari, но он не так эффективен. Safari не запоминает последнюю добавленную схему, поэтому вам придется вводить её снова и снова. А переход между браузером и приложением делает ситуацию хуже, ещё и тратит время.
👌 Расскажу о другом способе. Вы наверняка знаете, что есть xcrun, который можно использовать для запуска любого инструмента внутри Xcode из командной строки. Опцией для способа ниже является simctl, который и поможет вам управлять симуляторами.
Для этого можно использовать:
xcrun simctl openurl booted <url>
💻 В качестве параметра
url
нужно использовать вашу ранее созданную схему. В моём примере это: exampleapp://test
.Специально для @iOS Dev.
10 фактов про разработку первых айфонов от Кена Косиенды — сотрудника Apple с 15-летним опытом и изобретателя автозамены в iPhone
Разработка это не только написание кода, но и различные подходы к алгоритмам и решению тех или иных задач.
Иногда я встречаю интересные факты или алгоритмы, но ещё более важно — истории программистов, особенно тех, кто стоял у истоков. Сегодня я собрал для вас подборку из фактов от программиста Apple, с работой которого каждый из нас сталкивается чаще, чем может показаться.
@iOS Dev
Разработка это не только написание кода, но и различные подходы к алгоритмам и решению тех или иных задач.
Иногда я встречаю интересные факты или алгоритмы, но ещё более важно — истории программистов, особенно тех, кто стоял у истоков. Сегодня я собрал для вас подборку из фактов от программиста Apple, с работой которого каждый из нас сталкивается чаще, чем может показаться.
@iOS Dev
Telegraph
10 фактов про разработку первых айфонов от Кена Косиенды — сотрудника Apple с 15-летним опытом и изобретателя автозамены в iPhone
⚪ Однобуквенные и двухбуквенные комбинации были просто хардкодом. Тяжело поверить, но это правда. При вводе «ik» всегда была автокоррекция на «ok». ⚪ Автокоррекция на оригинальном iPhone была очень простой. Она всегда соответствовала количеству набранных…