Untitled

 avatar
unknown
swift
a year ago
15 kB
7
Indexable
//
//  ContentView.swift
//  footballcard
//
//  Created by Doğancan Mavideniz on 14.07.2024.
//

import SwiftUI
import UIKit

class DataModel: ObservableObject {
    @Published var editableText: String = ""
    @Published var pac1: String = ""
    @Published var pac2: String = ""
    @Published var pac3: String = ""
    @Published var pac4: String = ""
    @Published var pac5: String = ""
    @Published var pac6: String = ""
    @Published var pacST: String = ""
    @Published var name: String = "Mehmet Aly"
}

struct ContentView: View {
    @State private var showBackgroundPicker = false
    @State private var showCountryPicker = false
    @State private var selectedBacground = "bg"
    @State private var selectedCountry = "ulke"
    @StateObject private var dataModel = DataModel()
    @State private var selectedImage: UIImage? = nil
        @State private var isPickerPresented = false
    @State private var countries = ["ulke"]
    @State private var bgAssets: [String] = ["bg"]
    
    var body: some View {
        VStack {
            GeometryReader { geo in
                ScrollView(showsIndicators: false) {
                    SaveableView(geo: geo,
                                 selectedCountry: $selectedCountry,
                                 selectedBackground: $selectedBacground,
                                 showCountryPicker: $showCountryPicker,
                                 showBackgroundPicker: $showBackgroundPicker,
                                 dataModel: dataModel,
                                 selectedImage: $selectedImage,
                                 isPickerPresented: $isPickerPresented)
                        .frame(height: UIScreen.main.bounds.height * 0.8)
                    
                    Button("Change bgh") {
                        //showBackgroundPicker.toggle()
                        let bgAssetPaths = Bundle.main.paths(forResourcesOfType: "png", inDirectory: nil)

                        // 2. Tüm asset isimlerini array'e ekle (en sondaki nokta ve sonrasını silerek)
                        let bgAssets = bgAssetPaths.compactMap { path -> String? in
                            let fileNameWithExtension = URL(fileURLWithPath: path).lastPathComponent
                            guard let range = fileNameWithExtension.range(of: ".", options: .backwards) else {
                                return fileNameWithExtension
                            }
                            let fileNameWithoutExtension = String(fileNameWithExtension[..<range.lowerBound])
                            
                            // Eğer dosya adı içinde "nation" kelimesi geçiyorsa ekle, aksi halde ekleme
                            if fileNameWithoutExtension.lowercased().contains("cards") {
                                return fileNameWithoutExtension
                            } else {
                                return nil
                            }
                        }
                        
                        let countries = bgAssetPaths.compactMap { path -> String? in
                            let fileNameWithExtension = URL(fileURLWithPath: path).lastPathComponent
                            guard let range = fileNameWithExtension.range(of: ".", options: .backwards) else {
                                return fileNameWithExtension
                            }
                            let fileNameWithoutExtension = String(fileNameWithExtension[..<range.lowerBound])
                            
                            // Eğer dosya adı içinde "nation" kelimesi geçiyorsa ekle, aksi halde ekleme
                            if fileNameWithoutExtension.lowercased().contains("nation") {
                                return fileNameWithoutExtension
                            } else {
                                return nil
                            }
                        }
                       print(bgAssets)
                    }
                    Button("Save to Gallery") {
                        saveSnapshotToGallery()
                    }
                    .padding()
                }
            }
        }
        .onAppear() {
        }
        .sheet(isPresented: $isPickerPresented) {
            ImagePicker(selectedImage: $selectedImage, isPresented: $isPickerPresented)
        }
        .sheet(isPresented: $showCountryPicker) {
            CountryPickerView(selectedCountry: $selectedCountry, countries: countries)
        }
        .sheet(isPresented: $showBackgroundPicker) {
            BackgroundPickerView(selectedBackground: $selectedBacground, backgrounds: bgAssets)
        }
    }
    
    func saveSnapshotToGallery() {
        let rootView = SaveableView(geo: nil, selectedCountry: $selectedCountry, selectedBackground: $selectedBacground, showCountryPicker: $showCountryPicker, showBackgroundPicker: $showBackgroundPicker, dataModel: dataModel, selectedImage: $selectedImage, isPickerPresented: $isPickerPresented)
        let controller = UIHostingController(rootView: rootView)
        let view = controller.view
        
        // Görüntü boyutu ve görünüm sınırları
        let targetSize = CGSize(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height - 100)
        view?.bounds = CGRect(origin: .zero, size: targetSize)
        view?.backgroundColor = .clear
        
        let renderer = UIGraphicsImageRenderer(size: targetSize)
        let image = renderer.image { _ in
            view?.drawHierarchy(in: view!.bounds, afterScreenUpdates: true)
        }
        
        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
    }
}

struct SaveableView: View {
    var geo: GeometryProxy?
    @Binding var selectedCountry: String
    @Binding var selectedBackground: String
    @Binding var showCountryPicker: Bool
    @Binding var showBackgroundPicker: Bool
    @ObservedObject var dataModel: DataModel
    @Binding var selectedImage: UIImage?
    @Binding var isPickerPresented: Bool
    
    var body: some View {
        GeometryReader { geo in
            ZStack {
                Image(selectedBackground)
                    .resizable()
                    .aspectRatio(contentMode: .fit)
                    .frame(height: geo.size.height)
                    .onTapGesture {
                        showBackgroundPicker.toggle()
                    }
                VStack {
                    TextField("00", text: $dataModel.editableText.max(2))
                        .lineLimit(1)
                        .font(.title)
                        .multilineTextAlignment(.center)
                        .keyboardType(.numberPad)
                        .frame(width: geo.size.width * 0.2)
                    TextField("ST", text: $dataModel.pacST.max(2))
                        .lineLimit(1)
                        .font(.title)
                        .multilineTextAlignment(.center)
                        .keyboardType(.default)
                        .frame(width: geo.size.width * 0.2)
                    Image(selectedCountry)
                        .resizable()
                        .aspectRatio(contentMode: .fit)
                        .frame(width: geo.size.width * 0.1)
                        .onTapGesture {
                            showCountryPicker.toggle()
                        }
                    Image("lig")
                        .resizable()
                        .aspectRatio(contentMode: .fit)
                        .frame(width: geo.size.width * 0.1)
                }
                .frame(height: geo.size.height)
                .offset(x: geo.size.width * -0.3, y: geo.size.height * -0.15)
                VStack(spacing: 5) {
                    if let image = selectedImage {
                        Image(uiImage: image)
                            .resizable()
                            .aspectRatio(contentMode: .fit)
                            .frame(height: geo.size.height * 0.3)
                            .offset(x: 30)
                            .onTapGesture {
                                isPickerPresented.toggle()
                            }
                    } else {
                        Image("insan")
                            .resizable()
                            .aspectRatio(contentMode: .fit)
                            .frame(height: geo.size.height * 0.3)
                            .offset(x: 30)
                            .onTapGesture {
                                isPickerPresented.toggle()
                            }
                    }
                    TextField("Enter name", text: $dataModel.name)
                        .multilineTextAlignment(.center)
                        .keyboardType(.default)
                    HStack {
                        VStack {
                            Text("PAC")
                            TextField("31", text: $dataModel.pac1.max(2))
                                .multilineTextAlignment(.center)
                                .keyboardType(.numberPad)
                        }
                        VStack {
                            Text("PAC")
                            TextField("31", text: $dataModel.pac2.max(2))
                                .multilineTextAlignment(.center)
                                .keyboardType(.numberPad)
                        }
                        VStack {
                            Text("PAC")
                            TextField("31", text: $dataModel.pac3.max(2))
                                .multilineTextAlignment(.center)
                                .keyboardType(.numberPad)
                        }
                        VStack {
                            Text("PAC")
                            TextField("31", text: $dataModel.pac4.max(2))
                                .multilineTextAlignment(.center)
                                .keyboardType(.numberPad)
                        }
                        VStack {
                            Text("PAC")
                            TextField("31", text: $dataModel.pac5.max(2))
                                .multilineTextAlignment(.center)
                                .keyboardType(.numberPad)
                        }
                        VStack {
                            Text("PAC")
                            TextField("31", text: $dataModel.pac6.max(2))
                                .multilineTextAlignment(.center)
                                .keyboardType(.numberPad)
                        }    
                    }
                    .frame(width: geo.size.width * 0.7)
                    .font(.subheadline)
                    HStack(spacing: 5) {
                        Image(selectedCountry)
                            .resizable()
                            .aspectRatio(contentMode: .fit)
                            .frame(width: geo.size.width * 0.1)
                            .onTapGesture {
                                showCountryPicker.toggle()
                            }
                        Image("lig")
                            .resizable()
                            .aspectRatio(contentMode: .fit)
                            .frame(width: geo.size.width * 0.1)
                        Image("takim")
                            .resizable()
                            .aspectRatio(contentMode: .fit)
                            .frame(width: geo.size.width * 0.1)
                    }
                }
                .frame(width: geo.size.width - 32)
                .offset(y: geo.size.height >= 534 ? (geo.size.height * 0.050) : (geo.size.height * 0.1))
            }
        }
    }
}

struct CountryPickerView: View {
    @Binding var selectedCountry: String
    let countries: [String]
    @Environment(\.dismiss) var dismiss
    
    var body: some View {
        NavigationView {
            List(countries, id: \.self) { country in
                HStack {
                    Image(country)
                        .resizable()
                        .aspectRatio(contentMode: .fit)
                        .frame(width: 20)
                    Text(country)
                }
                .onTapGesture {
                    selectedCountry = country
                    dismiss()
                }
            }
            .navigationTitle("Select Country")
        }
    }
}

struct BackgroundPickerView: View {
    @Binding var selectedBackground: String
    let backgrounds: [String]
    @Environment(\.dismiss) var dismiss
    
    let gridItems = [
        GridItem(.flexible()),
        GridItem(.flexible()),
        GridItem(.flexible())
    ]
    
    var body: some View {
        NavigationView {
            ScrollView {
                LazyVGrid(columns: gridItems, spacing: 10) {
                    ForEach(backgrounds, id: \.self) { background in
                        Image(background)
                            .resizable()
                            .aspectRatio(contentMode: .fit)
                            .frame(maxWidth: .infinity, maxHeight: .infinity)
                            .onTapGesture {
                                selectedBackground = background
                                dismiss()
                            }
                    }
                }
                .padding()
            }
            .navigationTitle("Select Background")
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}


extension Binding where Value == String {
    func max(_ limit: Int) -> Self {
        if self.wrappedValue.count > limit {
            DispatchQueue.main.async {
                self.wrappedValue = String(self.wrappedValue.prefix(limit))
            }
        }
        return self
    }
}
import SwiftUI
import UIKit

struct ImagePicker: UIViewControllerRepresentable {
    @Binding var selectedImage: UIImage?
    @Binding var isPresented: Bool

    class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
        let parent: ImagePicker

        init(parent: ImagePicker) {
            self.parent = parent
        }

        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
            if let uiImage = info[.originalImage] as? UIImage {
                parent.selectedImage = uiImage
            }
            parent.isPresented = false
        }

        func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
            parent.isPresented = false
        }
    }

    func makeCoordinator() -> Coordinator {
        return Coordinator(parent: self)
    }

    func makeUIViewController(context: Context) -> UIImagePickerController {
        let picker = UIImagePickerController()
        picker.delegate = context.coordinator
        picker.sourceType = .photoLibrary
        return picker
    }

    func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {
        // Update logic when needed
    }
}
Editor is loading...
Leave a Comment