Swift 如何为形状添加自定义视图修改器

Swift 如何为形状添加自定义视图修改器,swift,swiftui,Swift,Swiftui,我想调用带有某种修改器的ImageView,使其中的图像成为圆形或方形。代码应该如下所示: ImageView(带URL:newsItem.imageUrl).test(Circle()) 为了得到这种行为,我读到你可以像下面一样扩展视图。它可以很好地与字符串配合使用,但我不明白形状有什么不同 我收到错误消息协议类型“Shape”不能符合“Shape”,因为只有具体类型才能符合协议,但我也不理解:/。有人能给我解释一下这个问题,我能做些什么吗 struct-ImageView:View{ va

我想调用带有某种修改器的ImageView,使其中的图像成为圆形或方形。代码应该如下所示:

ImageView(带URL:newsItem.imageUrl).test(Circle())
为了得到这种行为,我读到你可以像下面一样扩展视图。它可以很好地与字符串配合使用,但我不明白形状有什么不同

我收到错误消息协议类型“Shape”不能符合“Shape”,因为只有具体类型才能符合协议,但我也不理解:/。有人能给我解释一下这个问题,我能做些什么吗

struct-ImageView:View{
var clipShape:Shape
var body:一些观点{
ZStack{
图像(“swift”)
.可调整大小()
.aspectRatio(内容模式:.fill)
.clipShape(self.clipShape)
.阴影(半径:6)
}
}
}
扩展图像视图{
func测试(uu形状:形状)->Self{
var copy=self
copy.clipShape=形状
返回副本
}
}
顺便说一句,此代码缩短为仅显示特定问题的代码,视图包含的内容不止这些。这样你就不会质疑它的用途了

非常感谢

编辑:

有关形状不起作用的原因和操作方法,请参见: 在我的例子中,如果发现简单地裁剪整个ImageView就可以了。 我还想将此链接链接到您可以阅读自定义修饰符的地方,这是一个三步过程:

  • 制作一个
    ViewModifier
  • 使用一个函数扩展
    视图
    ,以应用修改器并返回修改后的视图
  • 在实际的
    视图上调用修改函数

  • 我在寻找相同的标题时发现了这个问题,但目的不同-我想创建一个修改器,可以专门应用于符合形状的东西,这样我就可以用它来做形状效果-笔划,等等

    但是,虽然我还没有找到答案,但我认为你的答案是ViewModifier无法插入/更改视图的内部值-相反,你应该考虑使用ViewBuilder

    我发现没有多少文章真正强调如何以及何时有效地选择使用ViewBuilder,但Majid的这篇文章做得相当好。 另外(幸运的是)在参考中包含一些示例代码(SwiftUI为数不多的地方之一),这些代码至少向您展示了如何使用它的一些基本想法


    基本要点是ViewModifier通常与View上的方法一起工作,其中ViewBuilder用作将视图组合在一起的一种方法,这听起来更像您想要的。最后,它们在所能做的事情上有很大的重叠——主要是在如何实现这一点上有所不同。

    你做的事情与我做的不一样。我想将修改器应用于整个视图,然后将图像作为目标。你只要直接写在课文上就行了。正如我所说的,我的代码可以处理字符串,但不能处理它们所附加到的视图的形状协议修改器。视图协议指定主体是某个视图,这意味着该类型是不透明的,您无法访问其内部成员。你仍然可以把剪辑对准封闭的视图。这对我没什么帮助,但我发现了一些东西。我编辑了这个问题。无论如何谢谢你!
    struct RedBackGroundModifier: ViewModifier {
      func body(content: Content) -> some View {
        content.background(Color.red)
      }
    }
    
    extension View {
      func makeTheBackGroundRed() -> some View {
        self.modifier(RedBackGroundModifier())
      }
    }
    
    struct ContentView: View {
      var body: some View {
        Text("Hello, World!").makeTheBackGroundRed()
      }
    }