Untitled
unknown
swift
a year ago
15 kB
10
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