SwiftUI自定义图像修改器

时间:2020-02-02 15:16:11

标签: 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)
    }
}

1 个答案:

答案 0 :(得分:9)

解决方案

您可以改为扩展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”类型的值(也称为“ _ViewModifier_Content”)没有成员“可调整大小”

这基本上是说任何.resizable()都没有View修饰符。 .resizable()修饰符仅在extension Image内部定义,因此没有其他View具有此修饰符。

这是核心问题-无法通过View中的Image参数访问原始的contentViewModifier就是我们想要的)。 / p>

这就是为什么我只是扩展了Image的原因。

希望这种解释有所帮助!