【问题标题】:SwiftUI custom Image ModifierSwiftUI 自定义图像修改器
【发布时间】:2020-05-18 12:25:29
【问题描述】:

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

【问题讨论】:

    标签: ios swift swiftui


    【解决方案1】:

    解决方案

    您可以改为扩展 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 具有此修饰符。

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

    这就是我刚刚为Image 扩展的原因。

    希望这个解释有帮助!

    【讨论】:

    • 感谢您的回答,但我也在研究为什么我的上面的解决方案不起作用。触发错误的幕后实际发生了什么?
    • @Pondorasti 添加了解释,希望对您有所帮助:)
    • 很好的答案,但它会在房间里留下一头大象。如果无法实现仅适用于图像的 ViewModifier,那么 .resizable() 本身是如何实现的?
    • @dented42 内置修饰符只是View 的扩展或特定类型的扩展(在本例中为Image)。我不知道有任何内置修饰符是ViewModifierViewModifier 是一个符合ViewModifier 协议的结构体,因此您可以使用.modifier(_:) 来应用它。
    • @dented42 这是一个很好的问题 - 它让我想到,如果 SwiftUI 本身不经常使用它,ViewModifier 的意义何在? Here is a question 与该主题有关。您也可以将其与ModifiedContent 一起使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    相关资源
    最近更新 更多