swift 有没有办法有条件地设置默认填充到一个特定的边缘?

iyfamqjs  于 2023-03-16  发布在  Swift
关注(0)|答案(4)|浏览(337)

我想在后缘使用默认的填充,但只有在条件为真的情况下。
对我来说,使用默认的填充而不是一个值是很重要的,这样SwiftUI就可以为我设置它。
这是我当前使用三元运算符的设置:

MyView()
    .padding(condition ? .trailing : /* what here?*/)

使用nil或.none不起作用,并将给予我一个错误
有什么想法吗?

yeotifhr

yeotifhr1#

paddinglength参数的documentation表示:如果将该值设置为nil,则SwiftUI将使用平台特定的默认金额。
因此,您可以始终指定一个尾随填充,但将长度设置为nil以获得默认值,将长度设置为0以不填充:

MyView()
    .padding(.trailing, condition ? nil : 0)
g52tjvyc

g52tjvyc2#

在简单的情况下,您可以只设置零或任何其他您需要的默认值:)

.padding(condition ? .trailing : 0)

但是如果需要按条件应用修饰符,可以使用View扩展和if方法(更多细节here):

extension View {
    @ViewBuilder func `if`<Content: View>(_ condition: Bool, transform: (Self) -> Content) -> some View {
        if condition {
            transform(self)
        } else {
            self
        }
    }
}

然后在代码中:

MyView()
    .if(condition) { 
        $0.padding(.trailing)
    }
voj3qocg

voj3qocg3#

因为padding的参数可以使用 * 类似数组 / 类似选项集 * 语法指定

.padding([.trailing])

你可以简单地写

.padding(condition ? .trailing : [])
70gysomp

70gysomp4#

你可以使用if语句。如果你不想使用if语句,你可以使用视图修饰符。
下面是视图修改器的代码:

struct MyPadding: ViewModifier {
    var condition: Bool
    func body(content: Content) -> some View {
        if condition{
            content
                .padding(.trailing)
        } else {
            content
        }
    }
    init(condition: Bool) {
        self.condition = condition
    }
}

您可以添加一个扩展来查看,以使用这个更容易:

extension View{
    func IfPadding(condition: Bool){ -> some View
        modifier(MyPadding(condition: condition))
    }
}

下面是如何使用它:

struct ContentView: View{
    var body: some View{
        Text("Hello, World!")
            .IfPadding(condition: true)
    }
}

相关问题