在SwiftUI中显示行/分隔符视图

Lin*_*rth 4 swift swiftui

我想在我的SwiftUI应用中显示分隔线。为此,我尝试创建一个具有固定框架和背景颜色/边框的空视图:

EmptyView()
    .frame(width: 200, height: 2)
    .background(Color.black) // or:
    .border(Color.black, width: 2)
Run Code Online (Sandbox Code Playgroud)

不幸的是,我看不到任何黑暗的景象。
有没有办法显示分隔符/线视图?

use*_*712 20

您可以使用颜色绘制一条线。如果你想改变线宽或内边距,你可以使用framepadding喜欢其他 SwiftUI 组件。

//Horizontal Line in VStack
VStack{
    Color.gray.frame(height:CGFloat(1) / UIScreen.main.scale)
}
//Vertical Line in HStack
HStack{
    Color.gray.frame(width:CGFloat(1) / UIScreen.main.scale)
}
Run Code Online (Sandbox Code Playgroud)


J. *_*Doe 14

使用Divider

可用于分隔其他内容的视觉元素。

例:

struct ContentView : View {
    var body: some View {
        VStack {
            Text("Hello World")
            Divider()
            Text("Hello Another World")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出: 在此处输入图片说明

  • 啊! 我试过`Separator`、`Line`,但没想到`Divider`。谢谢! (3认同)
  • @coolcool1994 将 VStack 的 `spacing` 设置为零。即`VStack(间距:0){…}` (3认同)
  • 你如何摆脱线下方和上方的神秘填充? (2认同)

Saj*_*jon 8

如果有人感兴趣分隔线,文本,分隔线,则如下所示:

在此处输入图片说明

LabelledDivider

struct LabelledDivider: View {

    let label: String
    let horizontalPadding: CGFloat
    let color: Color

    init(label: String, horizontalPadding: CGFloat = 20, color: Color = .gray) {
        self.label = label
        self.horizontalPadding = horizontalPadding
        self.color = color
    }

    var body: some View {
        HStack {
            line
            Text(label).foregroundColor(color)
            line
        }
    }

    var line: some View {
        VStack { Divider().background(color) }.padding(horizontalPadding)
    }
}
Run Code Online (Sandbox Code Playgroud)

这有点丑陋,但是我不得不将Dividers放到VStack使其水平的位置,否则,由于,它们将是垂直的HStack。如果您设法简化此过程,请告诉我:)

另外,也许使用和存储属性LabelledDivider可能不是最理想的SwiftUI解决方案,所以我愿意进行改进。

用法示例

这是导致上面显示的屏幕快照的代码:

struct GetStartedView: View {
    var body: some View {
        NavigationView {
            VStack {

                NavigationLink(destination: SignInView()) {
                    Text("Sign In").buttonStyleEmerald()
                }

                LabelledDivider(label: "or")

                NavigationLink(destination: SignUpView()) {
                    Text("Sign up").buttonStyleSaphire()
                }

            }.padding(20)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ButtonStyle

为了完整起见,我还包括buttonStyle视图修饰符:

struct ButtonStyle: ViewModifier {

    private let color: Color
    private let enabled: () -> Bool
    init(color: Color, enabled: @escaping () -> Bool = { true }) {
        self.color = color
        self.enabled = enabled
    }

    dynamic func body(content: Content) -> some View {
        content
            .padding()
            .frame(minWidth: 0, maxWidth: .infinity, alignment: .center)
            .foregroundColor(Color.white)
            .background(enabled() ? color : Color.black)
            .cornerRadius(5)
    }
}

extension View {
    dynamic func buttonStyleEmerald(enabled: @escaping () -> Bool = { true }) -> some View {
        ModifiedContent(content: self, modifier: ButtonStyle(color: Color.Radix.emerald, enabled: enabled))
    }

    dynamic func buttonStyleSaphire(enabled: @escaping () -> Bool = { true }) -> some View {
        ModifiedContent(content: self, modifier: ButtonStyle(color: Color.Radix.saphire, enabled: enabled))
    }

}

Run Code Online (Sandbox Code Playgroud)