­

SwiftUI:自定义修饰符

SwiftUI为我们提供了一系列内置修饰符,例如font()background()clipShape()。但是,也可以创建自定义修饰符来执行特定的操作。

例如,我们可能会说应用程序中的所有标题都应具有特定的样式,因此首先我们需要创建一个自定义的ViewModifier结构体,该结构体可以实现我们想要的功能:

struct Title: ViewModifier {      func body(content: Content) -> some View {          content              .font(.largeTitle)              .foregroundColor(.white)              .padding()              .background(Color.blue)              .clipShape(RoundedRectangle(cornerRadius: 10))      }  }

现在,我们可以将其与modify()修饰符一起使用——是的,它是一个名为“modifier”的修饰符,但是它允许我们将任何种类的修饰符应用于视图,如下所示:

Text("Hello World")      .modifier(Title())

使用自定义修饰符时,通常最好在View上创建扩展程序,以使其易于使用。例如,我们可以将Title修饰符包装在如下扩展中:

extension View {      func titleStyle() -> some View {          self.modifier(Title())      }  }

我们现在可以像这样使用修饰符:

Text("Hello World")      .titleStyle()

自定义修饰符不仅可以应用其他现有修饰符,还可以做更多的工作——它们还可以根据需要创建新的视图结构体。记住,修饰符会返回新对象,而不是修改现有对象,因此我们可以创建一个将视图嵌入堆栈并添加另一个视图的对象:

struct Watermark: ViewModifier {      var text: String        func body(content: Content) -> some View {          ZStack(alignment: .bottomTrailing) {              content              Text(text)                  .font(.caption)                  .foregroundColor(.white)                  .padding(5)                  .background(Color.black)          }      }  }    extension View {      func watermarked(with text: String) -> some View {          self.modifier(Watermark(text: text))      }  }

有了它,我们现在可以为任何视图添加水印,如下所示:

Color.blue      .frame(width: 300, height: 200)      .watermarked(with: "Hacking with Swift")

Previous: 视图拆分与组合

Hacking with iOS: SwiftUI Edition

Next: 自定义容器