SwiftUI:内容是图像的 ViewModifier

标签 swift swiftui swift-protocols

我收到一个错误“Type 'PlayButtonModifier' does not conform to protocol 'ViewModifier'”,我不明白为什么以及 - 更重要的是 - 如何正确处理。

我只是尝试创建一个 ViewModifier对于 Image , 这样我就可以使用 .resizable()就可以了,只定义在Image
ViewModifier协议(protocol),有一个 Typealias对于 Content定义。我的天真想法是这应该有效:

struct PlayButtonModifier: ViewModifier {
    typealias Content = Image

    func body(content: Content) -> some View {
        content
    }
}

嗯,不。太容易了。结构的隐式类型别名也会发生同样的事情:
struct PlayButtonModifier: ViewModifier {
    func body(content: Image) -> some View {
        content
    }
}

同样的错误。

这里有什么问题?怎么会是正确的?

最佳答案

在这种修改特定于特定 View 类型的情况下,Image比如说,您可以直接在该 View 类型上添加扩展:

extension Image {
    func myImageModifier() -> some View {
        self
            .resizable()
            .aspectRatio(1.0, contentMode: .fit)
            .clipShape(Circle())
   }
}

下面是一个完整的操场文本示例。如果您在名为“Otter.png”的游乐场“资源”文件夹中添加一张可爱的水獭图片,您会得到更漂亮的结果:)
import PlaygroundSupport
import SwiftUI

let image = (UIImage(named: "Otter.png") ?? UIImage(systemName: "exclamationmark.square")!)

struct ContentView: View {
    var body: some View {
        VStack {
            Text("hello world")
            Image(uiImage: image)
                .myImageModifier()
        }
    }
}

extension Image {
    func myImageModifier() -> some View {
        self
            .resizable()
            .aspectRatio(1.0, contentMode: .fit)
            .clipShape(Circle())
    }
}

PlaygroundPage.current.liveView = UIHostingController(rootView: ContentView())

关于SwiftUI:内容是图像的 ViewModifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58804696/

相关文章:

ios - 为什么在使用 CIFilter 时模拟器很慢

swift - 如何在 SwiftUI 中禁用甚至删除 macOS 中“ View ”菜单中的 EnterFullScreen 选项?

watchkit - watchOS - 如何从扩展委托(delegate)更新 SwiftUI View

SwiftUI Charts 如何向选定(或最后一个)BarMark 添加指示线

swift - 协议(protocol)不符合自身?

swift - 在 swift 中,如何返回符合协议(protocol)的相同类型的对象

ios - Swift:UIViewController 不会自动取消初始化

ios - 以编程方式设置自动布局约束

ios - 使用可选的初始化程序扩展 CollectionType

ios - 我如何在没有谷歌帐户的情况下使用 Firebase App 分发?