【问题标题】:Why does modifier order matter in SwiftUI? [duplicate]为什么修饰符顺序在 SwiftUI 中很重要? [复制]
【发布时间】:2020-06-01 20:33:12
【问题描述】:

在 SwiftUI 中将修饰符应用于视图时,似乎顺序很重要。

例如这段代码:

HStack {
  Text("Hello world")
    .padding()
    .background(Color(UIColor.darkGray))
    .cornerRadius(20.0)
}

..会产生这个:

改变修饰符的顺序,事情就会改变。此代码有效地“破坏”了修饰符,因为不再应用填充和角半径:

HStack {
  Text("Hello world")
    .background(Color(UIColor.darkGray))
    .padding()
    .cornerRadius(20.0)
}

这是为什么?我确信有一个合乎逻辑的解释,但我找不到任何文档或理由。

【问题讨论】:

    标签: swiftui


    【解决方案1】:

    修饰符是一个函数,它通过包装它修改的内容视图返回some View。例如.padding 返回实现填充功能的some View,其内容是它修改的视图,加上填充:

    所以,从概念上讲:

    HStack {
      Text("Hello world")
        .padding()
        .background(Color(UIColor.darkGray))
        .cornerRadius(20.0)
    }
    

    大致相当于(名称和参数组成):

    HStack(content: {
       CornerRadiusView(20.0, content: {
          BackgroundView(Color(UIColor.darkGray), content: {
             PaddingView(content: { 
                Text("Hello world") 
             })
          })
       })
    })
    

    希望从示例中可以清楚地看出修饰符的顺序如何改变视图层次结构。

    【讨论】:

      【解决方案2】:

      New Dev 的回答是正确的。 Here 也是另一个很好的解释幕后发生的事情。这只是同一概念的另一种观点:

      每当我们将修饰符应用到 SwiftUI 视图时,我们实际上会创建一个 应用了该更改的新视图——我们不只是修改现有的 查看到位。如果你仔细想想,这种行为是有道理的——我们的 视图只保存我们给它们的确切属性,所以如果我们设置 背景颜色或字体大小没有地方存储这些数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-07
        • 1970-01-01
        • 1970-01-01
        • 2013-05-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多