【问题标题】:Apply modifier to VStack inner views将修改器应用于 VStack 内部视图
【发布时间】:2021-12-04 12:22:37
【问题描述】:

我想创建一个ViewModifier,将其应用于VStack 时,它的样式看起来像Form 内的List,如下图所示。我有多个自定义场景,其中Lists 的行为不像我需要的那样,这是我需要这个的原因。

为了重新创建我曾经遵循代码的图像(我实际上使用了TextFields,但在示例中Texts 会这样做)

Form {
    Section {
        List {
            Text("Group name")
            Text("Group hashtags")
            Text("Group description")
        }
    }
}

我知道如何为特定视图创建修饰符,但我不知道如何检索 VStack 中的内部视图列表以处理它们。一旦我可以检索到它们,我需要为整个内容应用一个前导填充,并在所有视图之间放置一个分隔线。

当然我已经可以手动执行此操作,但修改器会更好,因为我可以在那里应用所有样式,也许还可以圆角并应用外部填充。

最终的结果应该是这样的:

VStack {
    Text("Group name")
    Text("Group hashtags")
    Text("Group description")
}
.modifier(ListStyleModifier())

【问题讨论】:

  • 为什么是-1?我见过很多人遇到这个问题。
  • 似乎没有任何方法可以枚举 VStack 之类的内部的各个视图。就添加样式修饰符的想法而言,例如,您可以使用修饰符注入描述样式类型的环境键,但您需要在堆栈中自定义组件来响应它们。该解决方案也没有提供对项目索引的访问权限,因此无法对顶部和底部项目进行不同的样式设置。这种事情在 SwiftUI 中似乎是一场艰苦的战斗(现在)。

标签: swiftui swiftui-list swiftui-form


【解决方案1】:

你可以这样尝试吗,在下面的方法中也有单个修饰符。 我也会接受@jnpdx 的建议。

 VStack {
        Text("Group name")
        Divider()
        Text("Group hashtags")
        Divider()
        Text("Group description")
    }
    .modifier(CustomViewModifier())

// MODIFIER
struct CustomViewModifier: ViewModifier {
func body(content: Content) -> some View {
   content
    .padding()
    .frame(maxWidth: .infinity)
    .background(Color(.lightGray))
    .cornerRadius(12)
    .padding()
  }
}

【讨论】:

    【解决方案2】:

    我会接受@jnpdx 的建议,并在当前时刻使用这个...

    VStack {
        Text("Group name")
            .modifier(ListStyleModifier())
        Text("Group hashtags")
            .modifier(ListStyleModifier())
        Text("Group description")
            .modifier(ListStyleModifier())
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多