我正在尝试创建一个ButtonStyle。我想让背景颜色是buttonBackgroundHover颜色,它已经在Assets.xcassets中创建,而其他时间则保留默认的背景色(与窗口的背景色相同)。所以我尝试了下面的代码,但是Xcode说了一个错误:Member 'background(ignoresSafeAreaEdges:)' expects argument of type 'Color'
struct PlayerButton: ButtonStyle {
@State private var isOnHover: Bool = false
func makeBody(configuration: Configuration) -> some View {
configuration.label
.background(isOnHover ? Color("buttonBackgroundHover") : .background)
}
}但是,如果我用.background(isOnHover ? Color("buttonBackgroundHover") : .background)替换.background(.background),这是没有争议的。我想知道这有什么问题,我如何解决这个问题。我很感谢你的帮助。
发布于 2022-05-11 13:01:16
background方法声明如下:
func background<S>(_ style: S, ignoresSafeAreaEdges edges: Edge.Set = .all) -> some View where S : ShapeStyle注意,它采用的参数类型是S,其中是S : ShapeStyle。当你做.background(.red)或.background(.background)时,S分别是Color或BackgroundStyle。
但是,当您通过时:
isOnHover ? Color("buttonBackgroundHover") : .background没有一种类型的S可以工作。您希望S是Color或BackgroundStyle,但是上面表达式的类型只能是其中的一种类型。编译器看到,由于Color("buttonBackgroundHover")是Color类型,所以它错误地认为您希望第三个操作数.background也是Color类型。但是没有像Color.background这样的属性,但是由于Color是一个视图,所以它也有一个background方法,这就是.background解析的目的。它需要一个Color参数,因为您正在调用一个没有实例(Color.background)的实例方法。
无论如何,ShapeStyle - AnyShapeStyle有一个类型的橡皮擦.应用此方法可以使条件表达式的两个分支都具有相同的类型:
.background(isOnHover ? AnyShapeStyle(Color("buttonBackgroundHover")) : AnyShapeStyle(.background))发布于 2022-05-11 12:18:46
没有颜色Color.background -它试图应用相同的.background()修饰符,但在三元操作符中有颜色第一,所以类型冲突-错误。
我想这是意料之中的
.background(isOnHover ? Color("buttonBackgroundHover") :
Color(uiColor: UIColor.systemBackground)) // << this !!https://stackoverflow.com/questions/72200791
复制相似问题