Kotlin/Swift (iOS) Туда и Обратно
36 subscribers
127 photos
21 videos
9 files
84 links
Канал - журнал, рассказывающий об опыте изучения Swift & iOS backend-разработчиком на Java & Kotlin
Download Telegram
Media is too big
VIEW IN TELEGRAM
Проект 14 (Дни 72 и 73) - финальный аккорд.

Не так уж много осталось:

🟢 Запросы к Wikipedia API, чтобы получить список мест рядом. И я проявил супер креативность 😊 - имя метки берёт title первого результата.

🟢 Сортировка списка мест, полученных из Wikipedia.

🟢 MVVM - слышал и читал про этот подход, когда делал десктопное приложение на Java. SwiftUI справляется гораздо лучше, т.к. он по-умолчанию “реактивный”.
Пока до тестов не добрался - всей прелести не увидел, но могу уже представить.

🟢 Face ID - его мы просто реализовали так же как и ранее (в подготовительном уроке). Тема раскрыта в одном из предыдущих постов.

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Всем привет! Закончил Проект 15 (дни 74, 75, 76)

Очень полезная тема, но, как мне кажется, для меня ещё не самая актуальная - доступность (accessibility).
Я верю, что сначала приложение должно быть хоть в какой-то рабочей форме, но при этом написано с учётом идеи, позволяющей легко добавить доступность в будущем.

Для меня это напоминает логирование: когда разрабатываешь приложение, важно думать о traceability (особенно в распределенной системе), но по-настоящему ощущаешь полноту логов, только когда начинаешь их анализировать в тестовой среде или при отладке. То же самое с доступностью - пока не попробуешь это на устройстве, сложно оценить, что действительно нужно улучшить.

#hackingwithswift
👍2
Проект 16 (день 79)

После проекта, сделанного в рамках челенжа, мне не терпится поскорее пройти курс дальше! Небольшой, но, как всегда, полезный урок:

🟢 Выбор нескольких элементов в списке. Активируется либо горизонтальным свайпом 2-мя пальцами, либо добавлением кнопки EditButton

🟢 TabView - пришло его время, но я уже использовал его в челенже ✌️ Концепция вполне простая, но очень полезная. Вижу почти в каждом приложении.

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
Проект 16 (день 80)

Сегодня тоже не много тем, точнее они не очень объемные, но они не становятся менее интересными:

🟢 Result - тип похожий на Either из функциональных языков. Может содержать в себе либо success, либо failure. В Kotlin такой тоже есть.

🟢 Интерполяция изображений - у Image есть interpolation расширение, можно настроить степень интерполяции. Если простыми словами, это дорисовать новые пиксели на основе существующих при увеличении изображения.

🟢 Контекстные меню - при нажатии на элемент (удерживая палец) можно вызвать меню. Автор рекомендует им не увлекаться, т.к. такой функционал не очень очевиден пользователям.
Кстати, на маке в Swift Playground это не работает, видимо только для тачскринов.

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Проект 16 (день 81)

Поскольку уроки небольшие, прохожу несколько за раз.
День 81 предлагает следующие темы:

🟢 Можно добавить кастомные свайп-кнопки на элементы списка

List {
Text("Taylor Swift")
.swipeActions {
Button("Delete", systemImage: "minus.circle", role: .destructive) {
print("Deleting")
}
}
.swipeActions(edge: .leading) {
Button("Pin", systemImage: "pin") {
print("Pinning")
}
.tint(.orange)
}
}


🟢 Нотификации. Фреймворк, насколько я понял, используется, скажем, не новый 😆

Запрашиваем права

UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { success, error in
if success {
print(“Всё ок!”)
} else if let error {
print(error.localizedDescription)
}
}


Делаем отправку

let content = UNMutableNotificationContent()
content.title = “Накорми кота”
content.subtitle = “Он “голодный
content.sound = UNNotificationSound.default

// показать нотификацию через 5 секунд
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)

// выбираем рандомный ид
let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)

UNUserNotificationCenter.current().add(request)


🟢 Подключение проектов как зависимости. Выглядит, на самом деле, как git submodule. Что тут ещё написать…?

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1😁1
Проект 16 (день 82)

И вновь день с небольшим количеством материала. Мы начали объединять пройденные ранее уроки в приложение для отслеживания людей, которых мы встретили на конференции:

🟢 Создали 4 основных таба, отражающих списки людей: все, с кем познакомились, с кем предстоит встретиться и информация о себе.
Для первых 3 табов используем одну и ту же View. Определяем тип с помощью перечисления:


enum FilterType {
case none, contacted, uncontacted
}


🟢 Добавили SwiftData, для этого подготовили такую модель


@Model
class Prospect {
var name: String
var emailAddress: String
var isContacted: Bool

init(name: String, emailAddress: String, isContacted: Bool) {
self.name = name
self.emailAddress = emailAddress
self.isContacted = isContacted
}
}


🟢Добавили динамическую фильтрацию в зависимости от FilterType при инициализации View:


init(filter: FilterType) {
self.filter = filter

if filter != .none {
let showContactedOnly = filter == .contacted

_prospects = Query(filter: #Predicate {
$0.isContacted == showContactedOnly
}, sort: [SortDescriptor(\Prospect.name)])
}
}


#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
Проект 16 (день 83)

Сегодня мы разбирались:

🟢 Как генерировать QR код
Для генерации использовали CIFilter.qrCodeGenerator(). Даже не подозревал, что настолько просто это можно сделать.
Тут пригодилась интерполяция, т.к. она включена по-умолчанию и изображение при масштабировании становится “мыльным”. Скину скрины для сравнения.

🟢 Как сканировать QR код
Для чтения использовали код автора (думаю, что это как раз тот код, упоминаемый тут https://t.me/kotlin2swift/86, по крайней мере называется он именно так).

🟢 Добавили возможность удаления записей с помощью свайпа.

Ниже приложу скриншоты 📸

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Проект 16 (день 84)

Две темы сегодня:

➡️ Контекстное меню на изображении - добавили кнопку “пошарить” QR код. Делается это довольно таки просто, что называется one-liner:


Image(uiImage: qrCode)
.interpolation(.none)
.resizable()
.scaledToFit()
.frame(width: 200, height: 200)
.contextMenu {
ShareLink(item: Image(uiImage: qrCode), preview: SharePreview("My QR Code", image: Image(uiImage: qrCode)))
}


Но тут мы столкнулись с чем-то новым: изменение UI во время изменения UI❗️
qrCode переменная - это @State, и код ниже вызывается при отрисовки UI. Присвоение qrCode нового значения меняет состояние, тогда это событие должно порождать новую итерацию перерисовки.


if let outputImage = filter.outputImage {
if let cgImage = context.createCGImage(outputImage, from: outputImage.extent) {
qrCode = UIImage(cgImage: cgImage)
return qrCode
}
}


➡️ Нотификации: проверка настроек нотификаций и добавление кнопки, чтобы мы получили нотификацию о конкретном человеке из нашего списка.

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Проект 17 (день 86)

Новый проект - новые горизонты
86 день открывает тайны жестов (gestures), чуть больше чем обычные нажатия (taps).

▶️ Двойной тап, нажание (long press), минимальное время нажания, щипок (magnify gesture), поворот (rotate gesture). Не очень большой, но уже внушительный список разнообразных жестов. А так же различные настройки жестов highPriorityGesture, simultaneousGesture, pressGesture.sequenced(before: dragGesture). Напоминают мне игру Fruit Ninja
Как утверждает автор, заигрываться с этим не стоит, т.к. пользователь должен интуитивно понимать интерфейс. Полностью согласен, и даже более чем: по опыту - мало кто вообще осваивает хоть какие-то жесты в приложениях для более комфортного использования. Поэтому впервую очереь базовый функционал!

▶️ allowsHitTesting - позволяет отключить tappable функциональность. Дополнительно рассматривали как ведут себя view обернутые в ZStack, VStack. К примеру, по умолчанию, Spacer в VStack не является кликабельным, но это можно испрваить указав .contentShape(.rect) у VStack

SwiftUI 👶 💪

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
Проект 17 (день 87)

Eщё один подготовительный, технический день:

▶️ Timer - механизм позволяющий выполнять переодические и (или) отложенные задачи. Интересно, что есть настройка tolerance, помогающая системе оптимизировать аккумулятор, откладывая вычисления.

▶️ ScenePhase - текущая состояние приложения, доступно через @Environment(\.scenePhase) var scenePhase, и позволяет понять когда пользователь, к примеру, свернул наше приложение.

▶️ Accessibility настройки, такие как accessibilityDifferentiateWithoutColor, позволяют настроить View под определенные запросы пользователя. Это не правило, которому нужно 100% придерживаться, а скорее рекомендация.

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Media is too big
VIEW IN TELEGRAM
Проект 17 (день 88)

Приступили к реализации приложения. Используем полученные навыки, поэтому обойдёмся сегодня только видео 🎥

Наконец-то свои карточки делаем 😆

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Проект 17 (день 89)

Сегодня в программе (всё можно увидеть на видео):

🟢 Цветные карточки при свайпе. Влево - 🔴 вправо - 🟢
При включенной опции accessibilityDifferentiateWithoutColor мы не красим карточки, а показываем индикаторы на экране куда смахивать правильные и куда неправильные карточки.

🟢 Таймер на экране и состояние активности приложения (когда можно смахивать карточки). Также когда приложение сворачивается - таймер останавливается. Если ничего не предпринимать, то несколько секунд будет потеряно, поскольку iOS не сразу останавливает таймер.

🟢 Финальный аккорд - кнопка перезапуска, если карточек больше не осталось.

Согласитесь классный курс? 🤩

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Проект 17 (день 90)

90 день, время летит, знания прибавляются

🟢 Пофиксили баги, оказывается они появляются не всегда просто так, а иногда намеренно, чтобы выучить новые уроки.
Самый забавный баг заключается в том, что не только верхнюю карточку можно смахнуть, но и любую другую из стека. В основном баги были связаны с accessibility. А так же с анимацией (не назвал бы это багом), добавили bounce анимацию, если карточка была недостаточно далеко отведена и отпущена.

🟢 Отдельная форма в конеце видео, позволяющая добавлять и удалять карточки. Делали это уже много раз.

Добавил карточки, которые, надеюсь, всем очевидны 😆

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Проект 17 (день 91)

Сегодня был день челенжа (доделывали прижение с карточками) и, как обычно, теоритический тест.
Из самостоятельных доделок:

➡️ Очищаю текстовые поля после добавления новой карточки
➡️ Пофиксил: если карточка была немного сдвинута вправо - при возвращении она становилась немного красной
➡️ При смахивании карточки влево, она возвращается обратно в стек. Это было самое сложное, т.к. пришлось переделать ForEach, который был основан на индексах. А так же реализовал разные обработчики свайпа вправо и влево.

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Начинаем проект 18 (день 92)

Это технический проект, где мы начинаем изучать особенности layout системы SwiftUI.
На мой взгляд, самая сложная тема, которая требует большого количества экспериментов. Поскольку порой поведение вьюшек, скажем, удивляет.

🔴 Основное правило определение размеров состоит из 3 шагов:
1️⃣ Parent предлагает доступное пространство (propose size)
2️⃣ Child выбирает свой собственный размер (chooses its size)
3️⃣ Parent позиционирует child внутри себя

🔴 alignmentGuide модификатор и кастомный VerticalAlignment. Тут я совсем не понял как это работает и нужно с этим отдельно разобраться #todo

🔴offset & position
🔸offset - относительное смещение, интересно, что не влияет на последующие модификаторы (например, background color);
🔸position - абсолютное позиционирование на экране.

Читал в группах по разработке, что layouts это одна из самых важных тем. Посмотрим как пойдёт дальше. Возможно, понадобится посмотреть дополнительные ролики или почитать статьи 👀

Как вам новый стиль эмоджи? 🔥 правда?

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3