swiftui - 如果我们可以使用视图扩展来修改视图,为什么还要使用视图修饰符呢?
问题描述
我写了一个自定义视图修饰符:
import SwiftUI
public struct Watermark: ViewModifier {
// watermark text
public var text: String = " watermark"
public var align: Alignment = .bottomTrailing
// body
public func body(content: Content) -> some View {
let textView = Text(text)
.font(.caption)
.foregroundColor(.white)
.padding(8)
.background(Color.black).padding(5)
.opacity(0.6)
return content.overlay(textView, alignment: align)
}
}
extension View {
// use view modifier
public func watermark(
_ text : String = " watermark",
_ align: Alignment = .bottomTrailing
) -> some View {
self.modifier(Watermark(text: text, align: align))
}
}
和一个View
扩展:
import SwiftUI
extension View {
// modify the view directly
public func watermark2(
_ text : String = " watermark",
_ align: Alignment = .bottomTrailing
) -> some View
{
let textView = Text(text)
.font(.caption)
.foregroundColor(.white)
.padding(8)
.background(Color.black).padding(5)
.opacity(0.6)
return self.overlay(textView, alignment: align)
}
}
以下代码使用View
上面的视图修饰符和扩展名:
import SwiftUI
import PlaygroundSupport
// content view
struct ContentView: View {
var body: some View {
VStack {
// use view modifier
Color.gray.watermark()
Color.gray.watermark("hello", .topTrailing)
// use view extension
Color.gray.watermark2("hi", .center)
Color.gray.watermark2("example", .topLeading)
}
}
}
PlaygroundPage.current.setLiveView(ContentView())
结果如下所示:
我的问题是:如果我们可以通过简单地使用View
扩展来完成这项工作,为什么还要使用视图修饰符呢?使用它有什么好处?
解决方案
推荐阅读
- python - 使用 pandas 重置 CSV 的列位置
- java - conn.prepareStatement(sql) 上的 java.lang.NullPointerException
- json - 如何将 REST API 调用返回的 JSON 解析为 JAX-RS 中的对象集合?
- swift - 如何检索firebase数据库值以计算平均值
- c++ - 为什么范围的算法与 std 的迭代器不兼容?
- earlgrey - 如何将earlgrey 配置为根本不跟踪网络呼叫?
- c++ - 我的变量在 C++ 中打印后无法获得 $ 打印符号
- python-3.x - Python - 如何输出列表中包含一定数量字母的字符串
- angular - Angular 6:设置空表单数组字段
- homebrew - 没有为自制软件找到 gpg-agent