Untitled
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