关于ios:如何在swiftUI中创建一个plain view

How to create a plain view in swiftUI

我正在尝试在 SwiftUI 中创建一个带有背景色的普通视图。但我能找到的所有元素都不是普通视图,如文本、按钮、图像、列表等。

当我尝试使用 View 时,它会显示以下错误消息:

  • 'View' cannot be constructed because it has no accessible initializers
  • 'View' Protocol can only be used as a generic constraint because it has Self or associatedType requirements

如何创建带有背景颜色的矩形视图?


只需使用 Rectangle()

如文档所述:

A rectangular shape aligned inside the frame of the view containing it.

这里是一个固定大小和背景颜色的矩形示例

1
2
3
Rectangle()
    .size(CGSize(width: 10, height: 10))
    .foregroundColor(.red)

以防万一您的用例类似于为 TextField 视图创建背景,以下是我的操作演示

这里的示例将创建一个带有不透明辅助背景的小视图,然后在其顶部呈现一个标签,表示用户输入一个位置,另一个白色圆角矩形,以及在白色矩形内的 TextField()。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
struct InputView : View {
    @State var text:          String

    var body: some View {
        ZStack{
            RoundedRectangle(cornerRadius: 15).frame(width: 310, height: 100)
                .foregroundColor(.secondary)
                .offset(y: -20)
            ZStack{
                RoundedRectangle(cornerRadius: 30).frame(width: 290, height: 40)
                    .foregroundColor(.white)
                TextField($text, placeholder: Text("City, State, Address")) {
                        print(self.text)
                        self.didEnter.toggle()
                    }
                        .frame(width: 220, height: 40, alignment: .leading)
                        .offset(x: -20)
                Text("Select Location:").bold().fontWeight(.medium)
                    .offset(y: -40)
                    .foregroundColor(.white)
            }
        }
    }
}

这是另一种创建类似 UIView 的方法。在 SwiftUI 中,每个原始视图都像 UIView 一样工作。

1
2
3
4
5
6
7
8
9
struct CustomView : View {

    var body: some View {
        ZStack{
            Color.red.frame(width: 300, height: 300)
            Text("This is view")
        }
    }
}

正如另一个答案中所建议的,您可以使用像 Rectangle() 这样的形状并将其设置为 sizeforegroundColor:

1
2
3
Rectangle()
    .size(CGSize(width: 10, height: 10))
    .foregroundColor(.blue)

但我认为直接使用 Color 更简单:

1
2
Color.blue
    .frame(width: 10, height: 10)