diff 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
line wrap: on
line diff
--- a/GeoQuiz/GuessTheFlagView.swift	Fri Oct 28 18:58:24 2022 +0200
+++ b/GeoQuiz/GuessTheFlagView.swift	Wed Nov 09 10:30:01 2022 +0100
@@ -8,7 +8,7 @@
 import SwiftUI
 
 struct GuessTheFlagView: View {
-    @StateObject var game = CountryGameController()
+    @StateObject var gameController = CountryGameController()
     
     @Environment(\.managedObjectContext) var moc
     
@@ -19,11 +19,11 @@
             
             GeometryReader { geo in
                 VStack {
-                    GameToolbar(game: game, color: .mayaBlue)
+                    GameToolbar(gameController: gameController, color: .mayaBlue)
                         .padding(.bottom)
                     
                     VStack(alignment: .center, spacing: 10) {
-                        Text("Question \(game.questionCounter) of \(game.data.count)")
+                        Text("Question \(gameController.questionCounter) of \(gameController.data.count)")
                             .font(.title3)
                             .foregroundColor(.white.opacity(0.7))
                         
@@ -32,30 +32,49 @@
                             .fontWeight(.semibold)
                             .foregroundColor(.white)
                         
-                        Text("\(game.correctAnswer.key)?")
+                        Text("\(gameController.correctAnswer.key)?")
                             .font(.largeTitle.bold())
                             .foregroundColor(.white)
+                            .multilineTextAlignment(.center)
                         
                     }
                     
                     Spacer()
                     VStack(spacing: 30) {
-                        ForEach(Array(game.userChoices.keys), id: \.self) { countryName in
+                        ForEach(Array(gameController.userChoices.keys), id: \.self) { countryName in
                             Button {
-                                game.answer((key: countryName, value: game.data[countryName]!)) {
-                                    game.selector()
+                                gameController.answer(
+                                    choice: (key: countryName, value: gameController.data[countryName]!),
+                                    wrongMessage: "That's the flag of \(countryName)"
+                                ) {
+                                    gameController.selector()
                                 }
                             } label: {
-                                Circle()
-                                    .stroke(.white, lineWidth: 6)
-                                    .frame(height: geo.size.height * 0.15)
-                                    .shadow(radius: 10)
+                                
+                                /*
+                                 THE PROBLEM:
+                                 SwiftUI caches the image when it's shown using the `Image(string)` API.
+                                 Once the image is not showed anymore, SwiftUI doesn't release memory,
+                                 so it keeps caching new images until the app crashes
+                                 UIImage(contentsOfFile: path) doesn't cache the image
+                                 
+                                 THE SOLUTION:
+                                 Using `UIImage(contentsOfFile: path)` images aren't cached.
+                                 */
+                                
+                                let flag = gameController.data[countryName]!.flag
+                                let flagPath = Bundle.main.path(forResource: flag, ofType: "png")!
+                                
+                                RoundedRectangle(cornerRadius: 20)
+                                    .foregroundColor(.white.opacity(0.5))
+                                    .frame(width: geo.size.height * 0.3, height: geo.size.height * 0.15)
                                     .overlay(
-                                        Image(game.data[countryName]!.flag)
-                                            .renderingMode(.original)
+                                        Image(uiImage: UIImage(contentsOfFile: flagPath)!)
                                             .resizable()
-                                            .scaledToFill()
-                                            .clipShape(Circle())
+                                            .scaledToFit()
+                                            .cornerRadius(20)
+                                            .shadow(radius: 10)
+                                            .padding()
                                     )
                             }
                         }
@@ -67,22 +86,12 @@
             }
         }
         .navigationBarHidden(true)
-        .modifier(GameAlertsModifier(game: game, gameType: .guessTheFlag, moc: moc))
+        .modifier(GameAlertsModifier(gameController: gameController, gameType: .guessTheFlag, moc: moc))
     }
 }
 
 struct GuessTheFlagView_Previews: PreviewProvider {
     static var previews: some View {
         GuessTheFlagView()
-            .previewDevice(PreviewDevice(rawValue: "iPhone 14 Pro Max"))
-            .previewDisplayName("iPhone 14 Pro Max")
-        
-        GuessTheFlagView()
-            .previewDevice(PreviewDevice(rawValue: "iPad Pro (12.9-inch) (5th generation)"))
-            .previewDisplayName("iPad Pro (12.9-inch)")
-        
-        GuessTheFlagView()
-            .previewDevice(PreviewDevice(rawValue: "iPhone 8"))
-            .previewDisplayName("iPhone 8")
     }
 }