Published on

Bumble kloni (2-qism): Foydalanuvchi kartasi va qiziqishlar

Authors

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!

Buy mea coffee