Mercurial > public > geoquiz
annotate GeoQuiz/GuessTheFlagView.swift @ 26:425078c01194
refactor code
author | Dennis C. M. <dennis@denniscm.com> |
---|---|
date | Wed, 09 Nov 2022 10:30:01 +0100 |
parents | 02dcebb8cc4a |
children | 3f4b366d476d |
rev | line source |
---|---|
0 | 1 // |
2 // GuessTheFlagView.swift | |
3 // GeoQuiz | |
4 // | |
5 // Created by Dennis Concepción Martín on 20/9/22. | |
6 // | |
7 | |
8 import SwiftUI | |
9 | |
10 struct GuessTheFlagView: View { | |
26 | 11 @StateObject var gameController = CountryGameController() |
0 | 12 |
15
f1967f8cc67b
first iteration of core data
Dennis C. M. <dennis@denniscm.com>
parents:
11
diff
changeset
|
13 @Environment(\.managedObjectContext) var moc |
f1967f8cc67b
first iteration of core data
Dennis C. M. <dennis@denniscm.com>
parents:
11
diff
changeset
|
14 |
0 | 15 var body: some View { |
16 ZStack { | |
17 LinearGradient(gradient: .main, startPoint: .top, endPoint: .bottom) | |
18 .ignoresSafeArea() | |
19 | |
3 | 20 GeometryReader { geo in |
10
a793f33f05fb
refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents:
8
diff
changeset
|
21 VStack { |
26 | 22 GameToolbar(gameController: gameController, color: .mayaBlue) |
10
a793f33f05fb
refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents:
8
diff
changeset
|
23 .padding(.bottom) |
0 | 24 |
11 | 25 VStack(alignment: .center, spacing: 10) { |
26 | 26 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
|
27 .font(.title3) |
a793f33f05fb
refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents:
8
diff
changeset
|
28 .foregroundColor(.white.opacity(0.7)) |
6 | 29 |
10
a793f33f05fb
refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents:
8
diff
changeset
|
30 Text("What is the flag of") |
a793f33f05fb
refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents:
8
diff
changeset
|
31 .font(.title) |
a793f33f05fb
refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents:
8
diff
changeset
|
32 .fontWeight(.semibold) |
a793f33f05fb
refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents:
8
diff
changeset
|
33 .foregroundColor(.white) |
a793f33f05fb
refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents:
8
diff
changeset
|
34 |
26 | 35 Text("\(gameController.correctAnswer.key)?") |
10
a793f33f05fb
refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents:
8
diff
changeset
|
36 .font(.largeTitle.bold()) |
a793f33f05fb
refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents:
8
diff
changeset
|
37 .foregroundColor(.white) |
26 | 38 .multilineTextAlignment(.center) |
10
a793f33f05fb
refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents:
8
diff
changeset
|
39 |
0 | 40 } |
41 | |
42 Spacer() | |
10
a793f33f05fb
refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents:
8
diff
changeset
|
43 VStack(spacing: 30) { |
26 | 44 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
|
45 Button { |
26 | 46 gameController.answer( |
47 choice: (key: countryName, value: gameController.data[countryName]!), | |
48 wrongMessage: "That's the flag of \(countryName)" | |
49 ) { | |
50 gameController.selector() | |
10
a793f33f05fb
refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents:
8
diff
changeset
|
51 } |
a793f33f05fb
refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents:
8
diff
changeset
|
52 } label: { |
26 | 53 |
54 /* | |
55 THE PROBLEM: | |
56 SwiftUI caches the image when it's shown using the `Image(string)` API. | |
57 Once the image is not showed anymore, SwiftUI doesn't release memory, | |
58 so it keeps caching new images until the app crashes | |
59 UIImage(contentsOfFile: path) doesn't cache the image | |
60 | |
61 THE SOLUTION: | |
62 Using `UIImage(contentsOfFile: path)` images aren't cached. | |
63 */ | |
64 | |
65 let flag = gameController.data[countryName]!.flag | |
66 let flagPath = Bundle.main.path(forResource: flag, ofType: "png")! | |
67 | |
68 RoundedRectangle(cornerRadius: 20) | |
69 .foregroundColor(.white.opacity(0.5)) | |
70 .frame(width: geo.size.height * 0.3, height: geo.size.height * 0.15) | |
20 | 71 .overlay( |
26 | 72 Image(uiImage: UIImage(contentsOfFile: flagPath)!) |
21 | 73 .resizable() |
26 | 74 .scaledToFit() |
75 .cornerRadius(20) | |
76 .shadow(radius: 10) | |
77 .padding() | |
20 | 78 ) |
8 | 79 } |
0 | 80 } |
81 } | |
82 | |
83 Spacer() | |
84 } | |
85 .padding() | |
86 } | |
87 } | |
88 .navigationBarHidden(true) | |
26 | 89 .modifier(GameAlertsModifier(gameController: gameController, gameType: .guessTheFlag, moc: moc)) |
0 | 90 } |
91 } | |
92 | |
93 struct GuessTheFlagView_Previews: PreviewProvider { | |
94 static var previews: some View { | |
7 | 95 GuessTheFlagView() |
0 | 96 } |
97 } |