Mercurial > public > geoquiz
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") } }