在 .foregroundStyle 修饰符中使用 Color 或 LinearGradient

问题描述 投票:0回答:3

我有以下代码:

@State var type: String = "color"
@State var color: Color = Color(.black)
@State var gradient: LinearGradient = LinearGradient(colors: [.orange, .red],
                                                         startPoint: .top,
                                                         endPoint: .center)


Text("Hello World!").foregroundStyle(type == "color" ? color : gradient)

它抱怨颜色和渐变不是同一类型。但是,修饰符没有条件逻辑。那么,怎样才能达到预期的效果呢?

注意:我有大约 14 个其他修饰符,因此包装 if else 不起作用,因为其他一些修饰符也有同样的问题,因此会有太多的 if else 组合。

swiftui
3个回答
0
投票

.foregroundStyle
接受类型为
ShapeStyle
的参数。因此,您必须创建自己的
ShapeStyle
实现。然而,
ShapeStyle
协议以及大多数 SwiftUI 都被 Apple 隐藏,因此尝试实现自己的
ShapeStyle
很棘手(并且可能存在问题)。

话虽如此,您可以按照

此处
的步骤创建自己的ShapeStyle,从而实现您想要完成的任务。 (归功于this答案)。只需将不同的情况放入
ShapeStyle
对象中并相应地设置样式即可。

您应该诚实地使用 if/else 语句,如果您担心可读性,请将其放入函数中。


0
投票

您可以将 ShapeStyle 泛型采用到您的视图模式中。例如:

struct MyView<Style: ShapeStyle>: View {
    let style: Style

    var body: some View {
        Rectangle().foregroundStyle(style)
    }
}

0
投票

Colour
LinearGradient
包裹在
AnyShapeStyle
中以实现类型擦除:

@State var type: String = "color"
@State var color: Color = Color(.black)
@State var gradient: LinearGradient = LinearGradient(colors: [.orange, .red],
                                                     startPoint: .top, 
                                                     endPoint: .center)
Text("Hello World!")
    .foregroundStyle(type == "color"
    ? AnyShapeStyle(color) : AnyShapeStyle(gradient))
© www.soinside.com 2019 - 2024. All rights reserved.