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