【问题标题】:SwiftUI: Modifier inside ArraySwiftUI:数组内的修饰符
【发布时间】:2020-02-12 08:35:15
【问题描述】:

我目前正在尝试将所有可能的修饰符直接放入一个数组中,然后通过 forEach 调用它们。它也适用于大多数人,不幸的是框架(高度,宽度,对齐)不是我想要的。文本和框架应同时对齐。但无论我怎么尝试,它都不起作用。另外,我也没有以这种方式整合 .bold 和 .italic 。 我知道还有其他方法。如果有可能,我希望能够以这种方式包含所有修饰符。这可能吗?

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()
    }
}

【问题讨论】:

    标签: arrays swiftui modifier


    【解决方案1】:

    更改修饰符的顺序(斜体或粗体必须仅应用于文本)

    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"),
           ]
    

    我有

    如果您想知道为什么 .largeTitle 不是斜体,请参阅 How to apply .italic() to .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
        }
    }
    

    这是(我希望如此)不言自明的

    【讨论】:

    • 谢谢。我希望在数组中直接使用粗体和斜体,以便我可以为每个索引单独决定。
    • @dankell 查看更新,它允许您将粗体和/或斜体定义为参数,因此很容易实现,正是您想要的。
    猜你喜欢
    • 2020-01-30
    • 2019-12-29
    • 2021-11-18
    • 2021-12-31
    • 1970-01-01
    • 2021-06-12
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多