样式视图传递给 SwiftUI 中的自定义视图

Posted

技术标签:

【中文标题】样式视图传递给 SwiftUI 中的自定义视图【英文标题】:Style views passed to custom view in SwiftUI 【发布时间】:2020-02-19 06:57:32 【问题描述】:

我希望能够像这样使用自定义View:传递给Nav 的视图的数量或类型可以不同。

Nav(
    width: 200
) 
    NavButton("Item 1", action: self.someAction, isActive: true)
    NavButton("Item 1", action: self.someAction, isActive: false)
    NavTitle("Page 1")

并且它会给出与以下相同的结果:

HStack 
    NavButton("Item 1", action: self.someAction, isActive: true)
    .frame(width: 200 / 3)
    NavButton("Item 1", action: self.someAction, isActive: false)
    .frame(width: 200 / 3)
    NavTitle("Page 1")
    .frame(width: 200 / 3)

这个想法是在导航栏中均匀分布项目。

我考虑过使用视图数组并将其作为属性传递,但这对我来说看起来很糟糕。有没有办法和我上面的例子一样,或者有更好的方法吗?

【问题讨论】:

您是否尝试过在两者之间使用 Spacer()? 如果第一个元素的标签比第三个长,会发生什么?我认为中间元素不会在中心,而是稍微向右? 所以在这种情况下,您必须提供标签的宽度和高度以及 .lineLimit(nil) 以获得正确的响应。喜欢下面的答案 以及如何在不为每个元素指定的情况下将元素的宽度和高度应用于自定义视图中的每个元素? 您必须为它创建一个具有高度和宽度的单独类,然后调用它 【参考方案1】:

像这样:-

import SwiftUI

struct ContentView: View 


    var body: some View 

        HStack 
            CustomText(text: "kjahsfgdi f")
            Spacer()
            CustomText(text: "abc")
            Spacer()
            CustomText(text: "abc")
        

    


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    


struct CustomText : View
    @State var text: String
    var body: some View 
        Text(text)
            .lineLimit(nil)
            .frame(width: 100, height: nil, alignment: .center)
    

【讨论】:

以上是关于样式视图传递给 SwiftUI 中的自定义视图的主要内容,如果未能解决你的问题,请参考以下文章

如何为通过 SwiftUI 中的自定义结构传递的 @State 值设置动画

将多个子视图传递给 SwiftUI 中的视图

如何将通用视图传递给 SwiftUI 中的结构

如何将可选视图传递给 SwiftUI 中的另一个视图?

将计时器传递给 SwiftUI 中的子视图

如何将一个 SwiftUI 视图作为变量传递给另一个视图结构