annotate GeoQuiz/GuessThePopulationView.swift @ 27:3f4b366d476d

add flag layout settings
author Dennis C. M. <dennis@denniscm.com>
date Thu, 10 Nov 2022 09:26:48 +0100
parents 425078c01194
children 6d574bd1644f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
1946bbfde4af reformat data structures
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
1 //
7
d945e52b0704 implement dynamic map
Dennis C. M. <dennis@denniscm.com>
parents: 6
diff changeset
2 // GuessThePopulationView.swift
6
1946bbfde4af reformat data structures
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
3 // GeoQuiz
1946bbfde4af reformat data structures
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
4 //
1946bbfde4af reformat data structures
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
5 // Created by Dennis Concepción Martín on 29/9/22.
1946bbfde4af reformat data structures
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
6 //
1946bbfde4af reformat data structures
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
7
1946bbfde4af reformat data structures
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
8 import SwiftUI
1946bbfde4af reformat data structures
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
9
27
3f4b366d476d add flag layout settings
Dennis C. M. <dennis@denniscm.com>
parents: 26
diff changeset
10 struct GuessThePopulationView: View, GameView {
26
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
11 @StateObject var gameController = CountryGameController()
10
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
12
15
f1967f8cc67b first iteration of core data
Dennis C. M. <dennis@denniscm.com>
parents: 10
diff changeset
13 @Environment(\.managedObjectContext) var moc
f1967f8cc67b first iteration of core data
Dennis C. M. <dennis@denniscm.com>
parents: 10
diff changeset
14
6
1946bbfde4af reformat data structures
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
15 var body: some View {
10
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
16 ZStack {
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
17 LinearGradient(gradient: .quaternary, startPoint: .top, endPoint: .bottom)
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
18 .ignoresSafeArea()
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
19
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
20 GeometryReader { geo in
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
21 VStack {
26
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
22 GameToolbar(gameController: gameController, color: .maizeCrayola)
23
02dcebb8cc4a fix layout issues
Dennis C. M. <dennis@denniscm.com>
parents: 21
diff changeset
23 .padding(.bottom)
10
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
24
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
25 Spacer()
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
26
26
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
27 /*
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
28 THE PROBLEM:
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
29 SwiftUI caches the image when it's shown using the `Image(string)` API.
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
30 Once the image is not showed anymore, SwiftUI doesn't release memory,
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
31 so it keeps caching new images until the app crashes
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
32 UIImage(contentsOfFile: path) doesn't cache the image
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
33
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
34 THE SOLUTION:
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
35 Using `UIImage(contentsOfFile: path)` images aren't cached.
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
36 */
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
37
27
3f4b366d476d add flag layout settings
Dennis C. M. <dennis@denniscm.com>
parents: 26
diff changeset
38 let flagPath = getFlagPath(forName: gameController.correctAnswer.value.flag)
3f4b366d476d add flag layout settings
Dennis C. M. <dennis@denniscm.com>
parents: 26
diff changeset
39
26
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
40 Image(uiImage: UIImage(contentsOfFile: flagPath)!)
21
b145c408f791 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 20
diff changeset
41 .renderingMode(.original)
b145c408f791 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 20
diff changeset
42 .resizable()
b145c408f791 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 20
diff changeset
43 .scaledToFit()
10
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
44 .clipShape(RoundedRectangle(cornerRadius: 20))
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
45 .shadow(radius: 10)
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
46 .frame(height: geo.size.height * 0.15)
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
47
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
48 Spacer()
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
49
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
50 VStack(alignment: .leading) {
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
51 VStack(alignment: .leading, spacing: 10) {
26
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
52 Text("Question \(gameController.questionCounter) of \(gameController.data.count)")
10
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
53 .font(.title3)
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
54 .foregroundColor(.white.opacity(0.7))
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
55
26
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
56 Text("What is the population of \(gameController.correctAnswer.key)?")
10
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
57 .font(.title)
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
58 .fontWeight(.semibold)
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
59 .foregroundColor(.white)
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
60 }
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
61
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
62 VStack(spacing: 15) {
26
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
63 ForEach(Array(gameController.userChoices.keys), id: \.self) { countryName in
10
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
64 Button {
26
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
65 gameController.answer(
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
66 choice: (key: countryName, value: gameController.data[countryName]!),
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
67 wrongMessage: "That's the population of \(countryName)"
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
68 ) {
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
69 gameController.selector()
10
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
70 }
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
71 } label: {
26
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
72 let population = gameController.data[countryName]!.population
10
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
73 AnswerButton(
19
f140bb277c96 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 15
diff changeset
74 name: population.formattedWithSeparator,
10
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
75 color: .middleRed
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
76 )
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
77 .frame(height: geo.size.height * 0.08)
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
78 }
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
79 }
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
80 }
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
81 }
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
82 .frame(maxWidth: 500)
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
83 }
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
84 .padding()
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
85 }
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
86 }
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
87 .navigationBarHidden(true)
26
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
88 .modifier(GameAlertsModifier(gameController: gameController, gameType: .guessThePopulation, moc: moc))
6
1946bbfde4af reformat data structures
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
89 }
1946bbfde4af reformat data structures
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
90 }
1946bbfde4af reformat data structures
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
91
10
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
92 struct GuessThePopulationView_Previews: PreviewProvider {
6
1946bbfde4af reformat data structures
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
93 static var previews: some View {
7
d945e52b0704 implement dynamic map
Dennis C. M. <dennis@denniscm.com>
parents: 6
diff changeset
94 GuessThePopulationView()
6
1946bbfde4af reformat data structures
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
95 }
1946bbfde4af reformat data structures
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
96 }