SwiftUI 自定义图像修改器

Pon*_*sti 2 ios swift swiftui

我正在尝试创建一个使用该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)
    }
}
Run Code Online (Sandbox Code Playgroud)

Geo*_*e_E 12

解决方案

您可以Image改为扩展。

像这样使用:

struct ContentView: View {

    var body: some View {
        VStack {
            Text("Hello World!")
            
            Image("someName")
                .imageIconModifier()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Image 延期:

extension Image {
    
    func imageIconModifier() -> some View {
        self
            .resizable()
            .aspectRatio(contentMode: .fit)
            .frame(width: 10, height: 10, alignment: .center)
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么您的解决方案不起作用

你首先得到错误:

类型“IconModifier”不符合协议“ViewModifier”

这意味着您IconModifier不满足ViewModifier协议的要求,如果我们看到定义:

func body(content: Self.Content) -> Self.Body
Run Code Online (Sandbox Code Playgroud)

而你有:

func body(content: Image) -> Self.Body
Run Code Online (Sandbox Code Playgroud)

这不起作用。所以接下来 - 我们将把它改为Content而不是Image

“IconModifier.Content”(又名“_ViewModifier_Content”)类型的值没有成员“可调整大小”

这基本上是说.resizable()any没有修饰符View。该.resizable()修饰符只里面定义里面extension Image,所以没有其他View有此修改。

这是核心问题-无法访问原始ViewImage通过为我们所希望的)content中的一个参数ViewModifier

这就是为什么我只是为Image.

希望这个解释有帮助!

  • @Pondorasti 添加了解释,希望有帮助:) (2认同)