Mercurial > public > geoquiz
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 |
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 | |
27 | 10 struct GuessTheFlagView: View, GameView { |
11 @ObservedObject var userController: UserController | |
12 | |
26 | 13 @StateObject var gameController = CountryGameController() |
0 | 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 | 17 var body: some View { |
18 ZStack { | |
19 LinearGradient(gradient: .main, startPoint: .top, endPoint: .bottom) | |
20 .ignoresSafeArea() | |
21 | |
3 | 22 GeometryReader { geo in |
10
a793f33f05fb
refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents:
8
diff
changeset
|
23 VStack { |
26 | 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 | 26 |
11 | 27 VStack(alignment: .center, spacing: 10) { |
26 | 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 | 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 | 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 | 40 .multilineTextAlignment(.center) |
10
a793f33f05fb
refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents:
8
diff
changeset
|
41 |
0 | 42 } |
43 | |
44 Spacer() | |
10
a793f33f05fb
refactor code and fix layout
Dennis C. M. <dennis@denniscm.com>
parents:
8
diff
changeset
|
45 VStack(spacing: 30) { |
26 | 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 | 48 gameController.answer( |
49 choice: (key: countryName, value: gameController.data[countryName]!), | |
50 wrongMessage: "That's the flag of \(countryName)" | |
51 ) { | |
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 | 55 |
56 /* | |
57 THE PROBLEM: | |
58 SwiftUI caches the image when it's shown using the `Image(string)` API. | |
59 Once the image is not showed anymore, SwiftUI doesn't release memory, | |
60 so it keeps caching new images until the app crashes | |
61 UIImage(contentsOfFile: path) doesn't cache the image | |
62 | |
63 THE SOLUTION: | |
64 Using `UIImage(contentsOfFile: path)` images aren't cached. | |
65 */ | |
27 | 66 |
67 let flagPath = getFlagPath(forName: gameController.data[countryName]!.flag) | |
68 Layout.showFlag(in: flagPath, geo: geo, userController) | |
8 | 69 } |
0 | 70 } |
71 } | |
72 | |
73 Spacer() | |
74 } | |
75 .padding() | |
76 } | |
77 } | |
78 .navigationBarHidden(true) | |
26 | 79 .modifier(GameAlertsModifier(gameController: gameController, gameType: .guessTheFlag, moc: moc)) |
0 | 80 } |
81 } | |
82 | |
83 struct GuessTheFlagView_Previews: PreviewProvider { | |
84 static var previews: some View { | |
27 | 85 GuessTheFlagView(userController: UserController()) |
0 | 86 } |
87 } |