首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI自定义图像修饰符

SwiftUI自定义图像修饰符
EN

Stack Overflow用户
提问于 2020-02-02 15:16:11
回答 1查看 2.5K关注 0票数 9

我正在尝试创建一个使用resizable()函数的自定义图像修饰符,因此我的content应该是一个Image。至少我是这么想的。

错误消息:键入“IconModifier”不符合协议“ViewModifier”

代码语言:javascript
复制
struct IconModifier: ViewModifier {
    func body(content: Image) -> some View {
        content
            .resizable()
            .aspectRatio(contentMode: .fit)
            .frame(width: 10, height: 10, alignment: .center)
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-02 15:56:20

解决方案

您可以直接扩展Image

使用方式如下:

代码语言:javascript
复制
struct ContentView: View {

    var body: some View {
        VStack {
            Text("Hello World!")
            
            Image("someName")
                .imageIconModifier()
        }
    }
}

Image扩展:

代码语言:javascript
复制
extension Image {
    
    func imageIconModifier() -> some View {
        self
            .resizable()
            .aspectRatio(contentMode: .fit)
            .frame(width: 10, height: 10, alignment: .center)
    }
}

为什么你的解决方案行不通

您首先得到的错误是:

类型的'IconModifier‘不符合协议'ViewModifier’

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

代码语言:javascript
复制
func body(content: Self.Content) -> Self.Body

而你却有:

代码语言:javascript
复制
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做了一个扩展。

希望这个解释有帮助!

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60027514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档