首页 > 解决方案 > 如果我们可以使用视图扩展来修改视图,为什么还要使用视图修饰符呢?

问题描述

我写了一个自定义视图修饰符:

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扩展来完成这项工作,为什么还要使用视图修饰符呢?使用它有什么好处?

标签: swiftui

解决方案


推荐阅读