我正在尝试创建一个使用resizable()函数的自定义图像修饰符,因此我的content应该是一个Image。至少我是这么想的。
错误消息:键入“IconModifier”不符合协议“ViewModifier”
struct IconModifier: ViewModifier {
func body(content: Image) -> some View {
content
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 10, height: 10, alignment: .center)
}
}发布于 2020-02-02 15:56:20
解决方案
您可以直接扩展Image。
使用方式如下:
struct ContentView: View {
var body: some View {
VStack {
Text("Hello World!")
Image("someName")
.imageIconModifier()
}
}
}Image扩展:
extension Image {
func imageIconModifier() -> some View {
self
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 10, height: 10, alignment: .center)
}
}为什么你的解决方案行不通
您首先得到的错误是:
类型的'IconModifier‘不符合协议'ViewModifier’
这意味着您的IconModifier不满足ViewModifier协议的要求,如果我们看到定义:
func body(content: Self.Content) -> Self.Body而你却有:
func body(content: Image) -> Self.Body这不起作用。所以接下来-我们将把它改为Content而不是Image
类型“IconModifier.Content”的IconModifier.Content值(又名“_ViewModifier_Content”)没有成员“可调整大小”
这基本上是说,没有.resizable()修饰符的任何View。.resizable()修饰符位于仅在extension Image内部定义的内部,因此没有其他View有此修饰符。
这就是核心问题--无法通过View中的content参数访问原始的ViewModifier (我们想要的东西的Image)。
这就是为什么我刚刚为Image做了一个扩展。
希望这个解释有帮助!
https://stackoverflow.com/questions/60027514
复制相似问题