Stanford CS193p - изменение размера шрифта в соответствии с количеством карт? - PullRequest
0 голосов
/ 26 мая 2020

Я выполняю последнее задание для Задания 1: «5. Когда ваша игра случайным образом отображает 5 пар, шрифт, который мы используем для смайликов, будет слишком большим (в портретной ориентации) и начнет обрезаться. отрегулируйте шрифт в случае 5 пар (только), чтобы использовать шрифт меньшего размера, чем .largeTitle. Продолжайте использовать .largeTitle, когда в игре 4 или меньше пар ".

Я добавил приведенный ниже код, но не могу понять, КАК это сделать правильно. Любая помощь очень ценится. Новичок в программировании для тех, кто достаточно супер, чтобы ответить!

struct ContentView: View {
var viewModel: EmojiMemoryGame

var body: some View {
    HStack {
        ForEach(viewModel.cards) { card in
            CardView(card: card).onTapGesture {
                self.viewModel.choose(card: card)
            }
// MARK: - Aspect Ratio 2/3
        }.aspectRatio(2/3, contentMode: .fit)
    }
        .padding()
        .foregroundColor(Color.orange)
  //.font(Font.largeTitle).   To be deleted once the below is made successful

  //TODO: - Add font size to allow 5 pairs of cards not to clip on portrait view

  if numberOfPairsOfCards.count >=5 {
            .font(Font.footnote)
        } else {
            .font(Font.largeTitle)
        }

Ответы [ 2 ]

0 голосов
/ 25 июня 2020

Я использовал тернарный оператор

struct ContentView: View {
var viewModel: EmojiMemoryGame

var body: some View {
    HStack {
        ForEach(viewModel.cards) { card in
            CardView(card: card).onTapGesture {
                self.viewModel.choose(card: card)
            }
            .aspectRatio(2/3, contentMode: .fit)
        }
    }
    .padding()
    .foregroundColor(Color.orange)
    .font(viewModel.cards.count == 10 ? Font.footnote : Font.largeTitle)
}}
0 голосов
/ 08 июня 2020

Итак, я добавил параметр при инициализации ContentView, поскольку обнаружил, что многие вещи не изменяются внутри contentView. Итак, у меня была строка в SceneDelagate для обработки типа шрифта

let game = EmojiMemoryGame()
    var fontType: Font
    if game.cards.count == 10{
        fontType = Font.body
    } else {
        fontType = Font.largeTitle
    }
    let contentView = ContentView(game_viewModel: game, fontType: fontType)

И вот мой код ContentView

struct ContentView: View {
var game_viewModel: EmojiMemoryGame
var fontType: Font
var body: some View {
    let cardStack = HStack {
        ForEach(game_viewModel.cards) { card in
            CardView(card: card).onTapGesture{
                self.game_viewModel.choose(card: card)
            }
        }
    }
        .padding()
        .foregroundColor(Color.orange)
        .font(fontType)
    return cardStack
}
}

Другой способ сделать это - добавить функцию для обновления шрифтов:

struct ContentView: View {
var game_viewModel: EmojiMemoryGame
func updatefont() -> Font{
    if game_viewModel.cards.count == 10{
        return Font.body
    } else {
        return Font.largeTitle
    }
}
var body: some View {
    let cardStack = HStack {
        ForEach(game_viewModel.cards) { card in
            CardView(card: card).onTapGesture{
                self.game_viewModel.choose(card: card)
            }
        }
    }
        .padding()
        .foregroundColor(Color.orange)
        .font(updatefont())
    return cardStack
}
}
...