SwiftUI: модификатор внутри массива - PullRequest
1 голос
/ 12 февраля 2020

В настоящее время я пытаюсь поместить все возможные модификаторы непосредственно в массив, а затем вызвать их через forEach. Он работает с большинством из них, к сожалению, с рамкой (высота, ширина, выравнивание) не так, как мне бы хотелось. Текст и рамка должны быть выровнены одновременно. Но как бы я ни старался, это не сработало. Кроме того, я также не могу таким образом интегрировать .bold и .itali c. Я знаю, что есть и другие способы. Если это возможно, я бы хотел включить все модификаторы таким образом. Это вообще возможно?

import SwiftUI

struct Tests: Identifiable {
    var id: Int
    var text: String
    var textcolor: Color
    var textfont: Font
    var height: CGFloat
    var width: CGFloat
    var alignment: Alignment
    var textbackcolor: Color
    var corner: CGFloat
    var show: Bool
    var user: String
}

struct ContentView: View {

    @State private var testvar = [
        Tests(id: 000, text: "Hello World 1", textcolor: .red, textfont: .title, height: 100, width: 300, alignment: .trailing, textbackcolor: .blue, corner: 20, show: true, user: "System"),
        Tests(id: 001, text: "Hello World 2", textcolor: .green,  textfont: .largeTitle, height: 100, width: 300, alignment: .center, textbackcolor: .black, corner: 50, show: true, user: "George"),
       ]

    var body: some View {
        NavigationView {
            VStack {

                    ForEach(self.testvar) { txt in if txt.show == true {
                        Text("\(txt.text)")
                            .frame(width: txt.width, height: txt.height, alignment: txt.alignment)
                            .font(txt.textfont)
                            .foregroundColor(txt.textcolor)
                            .background(txt.textbackcolor)
                            .cornerRadius(txt.corner)
                        //.bold?
                        //.italic?
                        } }
               }
        }
    }
}


struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

1 Ответ

2 голосов
/ 13 февраля 2020

Изменение порядка модификаторов ( itali c или жирный шрифт должен применяться только к тексту )

ForEach(self.testvar) { txt in if txt.show == true {
    Text("\(txt.text)")
        .bold()
        .italic()
        .frame(width: txt.width, height: txt.height, alignment: txt.alignment)
        .font(txt.textfont)
        .foregroundColor(txt.textcolor)
        .background(txt.textbackcolor)
        .cornerRadius(txt.corner)
    }
}

к данным

@State private var testvar = [
        Tests(id: 000, text: "Hello World 1", textcolor: .red, textfont: .title, height: 100, width: 300, alignment: .trailing, textbackcolor: Color(.blue).opacity(0.2), corner: 20, show: true, user: "System"),
        Tests(id: 001, text: "Hello World 2", textcolor: .green,  textfont: .largeTitle, height: 300, width: 300, alignment: .center, textbackcolor: .black, corner: 50, show: true, user: "George"),
       ]

У меня есть enter image description here

Если вам интересно , почему .largeTitle не itali c, пожалуйста, смотрите Как подать заявку .itali * От 1035 * () до .largeTitle Font?

ОБНОВЛЕНИЕ, чтобы отразить обсуждение

, чтобы иметь возможность изменять стиль на основе значений в вашем массиве, используйте простые Расширение текста

extension Text {
    func style(bold: Bool = false, italic: Bool = false) -> Self {
        var s = self
        if bold {
            s = s.bold()
        }
        if italic {
            s = s.italic()
        }
        return s
    }
}

, которое (я надеюсь) не требует пояснений

enter image description here

...