annotate GeoQuiz/GuessTheFlagView.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
0
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
1 //
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
2 // GuessTheFlagView.swift
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
3 // GeoQuiz
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
4 //
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
5 // Created by Dennis Concepción Martín on 20/9/22.
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
6 //
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
7
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
8 import SwiftUI
413e2d21333e first commit
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 GuessTheFlagView: View, GameView {
3f4b366d476d add flag layout settings
Dennis C. M. <dennis@denniscm.com>
parents: 26
diff changeset
11 @ObservedObject var userController: UserController
3f4b366d476d add flag layout settings
Dennis C. M. <dennis@denniscm.com>
parents: 26
diff changeset
12
26
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
13 @StateObject var gameController = CountryGameController()
0
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
14
15
f1967f8cc67b first iteration of core data
Dennis C. M. <dennis@denniscm.com>
parents: 11
diff changeset
15 @Environment(\.managedObjectContext) var moc
f1967f8cc67b first iteration of core data
Dennis C. M. <dennis@denniscm.com>
parents: 11
diff changeset
16
0
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
17 var body: some View {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
18 ZStack {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
19 LinearGradient(gradient: .main, startPoint: .top, endPoint: .bottom)
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
20 .ignoresSafeArea()
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
21
3
4dbe0cd9dadc first game prototype
Dennis C. M. <dennis@denniscm.com>
parents: 0
diff changeset
22 GeometryReader { geo in
10
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
23 VStack {
26
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
24 GameToolbar(gameController: gameController, color: .mayaBlue)
10
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
25 .padding(.bottom)
0
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
26
11
039b26a99a48 implementing RevenueCat
Dennis C. M. <dennis@denniscm.com>
parents: 10
diff changeset
27 VStack(alignment: .center, spacing: 10) {
26
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
28 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
29 .font(.title3)
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
30 .foregroundColor(.white.opacity(0.7))
6
1946bbfde4af reformat data structures
Dennis C. M. <dennis@denniscm.com>
parents: 5
diff changeset
31
10
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
32 Text("What is the flag of")
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
33 .font(.title)
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
34 .fontWeight(.semibold)
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
35 .foregroundColor(.white)
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
36
26
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
37 Text("\(gameController.correctAnswer.key)?")
10
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
38 .font(.largeTitle.bold())
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
39 .foregroundColor(.white)
26
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
40 .multilineTextAlignment(.center)
10
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
41
0
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
42 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
43
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
44 Spacer()
10
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
45 VStack(spacing: 30) {
26
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
46 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
47 Button {
26
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
48 gameController.answer(
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
49 choice: (key: countryName, value: gameController.data[countryName]!),
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
50 wrongMessage: "That's the flag of \(countryName)"
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
51 ) {
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
52 gameController.selector()
10
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
53 }
a793f33f05fb refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents: 8
diff changeset
54 } label: {
26
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
55
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
56 /*
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
57 THE PROBLEM:
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
58 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
59 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
60 so it keeps caching new images until the app crashes
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
61 UIImage(contentsOfFile: path) doesn't cache the image
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
62
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
63 THE SOLUTION:
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
64 Using `UIImage(contentsOfFile: path)` images aren't cached.
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
65 */
27
3f4b366d476d add flag layout settings
Dennis C. M. <dennis@denniscm.com>
parents: 26
diff changeset
66
3f4b366d476d add flag layout settings
Dennis C. M. <dennis@denniscm.com>
parents: 26
diff changeset
67 let flagPath = getFlagPath(forName: gameController.data[countryName]!.flag)
3f4b366d476d add flag layout settings
Dennis C. M. <dennis@denniscm.com>
parents: 26
diff changeset
68 Layout.showFlag(in: flagPath, geo: geo, userController)
8
e09959b4e4a8 fix bugs
Dennis C. M. <dennis@denniscm.com>
parents: 7
diff changeset
69 }
0
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
70 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
71 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
72
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
73 Spacer()
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
74 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
75 .padding()
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
76 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
77 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
78 .navigationBarHidden(true)
26
425078c01194 refactor code
Dennis C. M. <dennis@denniscm.com>
parents: 23
diff changeset
79 .modifier(GameAlertsModifier(gameController: gameController, gameType: .guessTheFlag, moc: moc))
0
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
80 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
81 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
82
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
83 struct GuessTheFlagView_Previews: PreviewProvider {
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
84 static var previews: some View {
27
3f4b366d476d add flag layout settings
Dennis C. M. <dennis@denniscm.com>
parents: 26
diff changeset
85 GuessTheFlagView(userController: UserController())
0
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
86 }
413e2d21333e first commit
Dennis C. M. <dennis@denniscm.com>
parents:
diff changeset
87 }