- Published on
Bumble kloni (2-qism): Foydalanuvchi kartasi va qiziqishlar
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
Asosiy oyna: BumbleCardView
Bumble ilovasida markaziy qism — foydalanuvchilarning rasmlari ustida tepaga-pastga siljiydigan (Vertical Scroll) va o'ngga-chapga surib tashlanadigan (Swipe) "karta" lardir.
Buning uchun alohida BumbleCardView yaratamiz. Biz u yerda juda ko'p narsani yig'amiz: katta profil rasmi, ismi, kasbi, shuningdek foydalanuvchi haqida kichik ma'lumot qismlari (About Me, qiziqishlar).
Avvalo asosiy rasmni (Karta sarlavhasini) yasab olaylik. Bu rasm qotib qolmasdan ekran hajmiga to'g'ri moslashishi uchun, ScrollView balandligini maxsus GeometryReader orqali dinamik hisoblaymiz:
import SwiftUI
import SwiftfulUI
struct BumbleCardView: View {
var user: User = User.mock
@State private var cardFrame: CGRect = .zero // Kartaning dinamik o'lchami
var body: some View {
ScrollView(.vertical, showsIndicators: false) {
LazyVStack(spacing: 0) {
headerCell // Asosiy katta rasm
aboutMeSection
myInterestsSection
// Boshqa rasmlari:
ForEach(user.images, id: \.self) { image in
ImageLoaderView(urlString: image)
.frame(height: cardFrame.height) // Har bir rasm ekran bilan bir xil bo'ladi
}
}
}
.scrollIndicators(.hidden)
.background(Color.bumbleBackgroundYellow)
.cornerRadius(32) // Chetlari aylana karta shaklida
.readingFrame { frame in
// ScrollView hajmini ushlab olamiz
self.cardFrame = frame
}
}
// Asosiy katta rasm va uning ustidagi yozuvlar
private var headerCell: some View {
ZStack(alignment: .bottomLeading) {
ImageLoaderView(urlString: user.image)
VStack(alignment: .leading, spacing: 8) {
Text("\(user.firstName), \(user.age)")
.font(.largeTitle)
.fontWeight(.semibold)
// Kasbi va o'qish joyi...
}
.padding(24)
.foregroundColor(.bumbleWhite)
.frame(maxWidth: .infinity, alignment: .leading)
.background(
// Oq yozuv aniq ko'rinishi uchun orqa fon gradienti
LinearGradient(
colors: [.clear, .bumbleBlack.opacity(0.6), .bumbleBlack.opacity(0.6)],
startPoint: .top,
endPoint: .bottom
)
)
}
.frame(height: cardFrame.height) // Asosiy rasm ham butun ekranni egallaydi
}
}
Pill ko'rinishidagi qiziqishlar katakchasi
Bumble ilovasidagi foydalanuvchi qiziqishlari "Kapsula" (Pill) ko'rinishida yozilgan. U yo ikonka, yoki emoji bilan boshlanadi va keyin tekst yoziladi. Buning uchun InterestPillView yasaymiz:
import SwiftUI
struct InterestPillView: View {
var iconName: String? = "heart.fill"
var emoji: String? = "🏃"
var text: String = "Running"
var body: some View {
HStack(spacing: 4) {
if let iconName {
Image(systemName: iconName)
} else if let emoji {
Text(emoji)
}
Text(text)
}
.font(.callout)
.fontWeight(.medium)
.padding(.vertical, 6)
.padding(.horizontal, 12)
.foregroundColor(.bumbleBlack)
.background(Color.bumbleLightYellow)
.cornerRadius(32)
}
}
Endi, odamning juda ko'plab qiziqishlari bo'lishi mumkin va ular chapdan o'ngga sig'may qolsa, avtomatik ravishda pastki qatorga tushishi kerak. SwiftUI ning standart ro'yxatlarida (LazyVGrid) bu qiyin bo'lishi mumkin. Shu joyida yana biz o'rnatgan SwiftfulUI paketining NonLazyVGrid idan foydalanamiz, chunki u kapsulalarning har xil uzunligiga chiroyli moslasha oladi.
Shu tarzda biz foydalanuvchining shaxsiy varaqasini yasab tugatdik. Keyingi darsda bu kartalarni o'ngga va chapga haqiqiy tanishuv dasturlaridek surib tashlashni (Swipe gesture) ko'rib chiqamiz!