繁体   English   中英

SwiftUI 自定义图像修改器

[英]SwiftUI custom Image Modifier

我正在尝试创建一个使用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)
    }
}

解决方案

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

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

这就是核心问题 - 无法通过ViewModifiercontent参数访问原始View (我们想要的Image )。

这就是为什么我只是为Image做了一个扩展。

希望这个解释有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM