1、VStack(垂直布局)(对应还有LazyVStack懒加载垂直布局,iOS 14.0才可使用)
VStack 会一次性渲染所有视图,无论它们是在屏幕上还是屏幕外。 当您有少量子视图或不希望“懒加载”延迟渲染时,请使用常规 VStack。
import SwiftUI
struct ContentView: View {
var body: some View {
VStack(
alignment: .leading,
spacing: 10
) {
ForEach(
0...10,
id: \.self
) {
Text("Item \($0)")
.background(Color.blue)
}
}
}}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
alignment:对接方式,左/中/右
extension HorizontalAlignment {
/// A guide marking the leading edge of the view.
public static let leading: HorizontalAlignment
/// A guide marking the horizontal center of the view.
public static let center: HorizontalAlignment
/// A guide marking the trailing edge of the view.
public static let trailing: HorizontalAlignment
}
spacing:间距
2、HStack(水平布局)(对应还有LazyHStack懒加载水平布局,iOS 14.0才可使用)
HStack 会一次性渲染所有视图,无论它们是在屏幕上还是屏幕外。 当您有少量子视图或不希望“懒加载”延迟渲染时,请使用常规 HStack。
var body: some View {
HStack(
alignment: .top,
spacing: 10
) {
ForEach(
1...5,
id: \.self
) {
Text("Item \($0)")
}
}
}
3、ZStack(层叠布局)
ZStack 为每个连续的子视图分配比前一个更高的 z 轴值,这意味着后面的子视图出现在前面的子视图的“顶部”。
下面的示例创建一个 100 x 100 点的 ZStack 矩形视图,填充六种颜色之一,将每个连续的子视图偏移 10 点,使它们不会完全重叠:
let colors: [Color] =
[.red, .orange, .yellow, .green, .blue, .purple]
var body: some View {
ZStack {
ForEach(0..
import SwiftUI
struct ContentView: View {
var body: some View {
ZStack {
Rectangle()
.fill(Color.red)
.frame(width:300, height:300)
.zIndex(0)
Rectangle()
.fill(Color.blue)
.frame(width:200, height:200)
Rectangle()
.fill(Color.yellow)
.frame(width:100, height:100)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
zIndex:层叠优先级,从大到小1-0
4、Spacer (填充布局)
一个灵活的填充空间布局,垂直/水平填充,默认填充满剩余所有空间,也可以指定填充的宽度或高度
-
4-1 未填充前的水平布局
- 4-2 填充后的水平布局(垂直布局一样的效果)
import SwiftUI
struct ContentView: View {
var body: some View {
HStack(
alignment: .top,
spacing: 10
) {
Text("Item 1")
.background(Color.purple)
Spacer()
Text("Item 2")
.background(Color.purple)
Spacer()
Text("Item 3")
.background(Color.purple)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
- 4-3 填充后的水平布局(垂直布局一样的效果)
import SwiftUI
struct ContentView: View {
var body: some View {
HStack(
alignment: .top,
spacing: 10
) {
Spacer()
Text("Item 1")
.background(Color.purple)
Spacer()
Text("Item 2")
.background(Color.purple)
Spacer()
Text("Item 3")
.background(Color.purple)
Spacer()
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
minLength:设置填充最小宽度/高度
5、ScrollView
滚动视图在可滚动内容区域内显示其内容。 当用户执行适合平台的滚动手势时,滚动视图会调整底层内容的可见部分。 ScrollView 可以水平、垂直或同时滚动,但不提供缩放功能。(一般配合HStack、VStack等布局使用)
在以下示例中,ScrollView 允许用户滚动包含 100 个文本视图的 VStack。 列表后的图像显示了右侧滚动视图的临时可见滚动条; 您可以使用 ScrollView 初始值设定项的 showsIndicators 参数禁用它。
var body: some View {
ScrollView {
VStack(alignment: .leading) {
ForEach(0..<100) {
Text("Row \($0)")
}
}
}
}
Axis.set: 设置滚动方向/水平/垂直
showsIndicators:是否显示滚动指示器
6、GeometryReader(相对布局)
一个容器视图,将其内容定义为它自己的大小和坐标空间的函数。可以获取到视图的大小和坐标
import SwiftUI
struct ContentView : View {
var body: some View {
VStack {
Text("Hello There!").background(Color.orange)
MyRectangle()
}.frame(width: 150, height: 100).border(Color.yellow)
}
}
struct MyRectangle: View {
var body: some View {
GeometryReader { geometry in
Rectangle()
.path(in: CGRect(x: geometry.size.width + 5,
y: 0,
width: geometry.size.width/2,
height: geometry.size.height))
.fill(Color.pink)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
7、ViewBuilder
通常使用 ViewBuilder 作为子视图生成闭包参数的参数属性,允许这些闭包提供多个子视图。 例如,以下CustomView接受一个通过视图构建器生成一个或多个视图的闭包。(通常用来自定义View、dialog、toast等)
import SwiftUI
struct ContentView : View {
var body: some View {
CustomView{
Text("Itme 1")
Text("Itme 2")
Text("Itme 3")
}
}
}
struct CustomView:View where Content:View {
private let content:Content
init(@ViewBuilder content:() -> Content) {
self.content = content()
}
var body: some View{
VStack{
content
.padding()
}
.foregroundColor(.orange)
.background(Color.pink)
.font(.title)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
8、LazyVGrid (懒加载垂直网格布局)(iOS 14.0才可使用)
控件显示到屏幕里才会加载(性能会有提升)
import SwiftUI
struct ContentView : View {
var body: some View {
let columns: [GridItem] =
Array(repeating: .init(.flexible(), spacing: 0), count: 4)
ScrollView {
LazyVGrid(columns: columns) {
ForEach((0...79), id: \.self) {
let codepoint = $0 + 0x1f600
let emoji = String(Character(UnicodeScalar(codepoint)!))
Text("\(emoji)")
.font(.largeTitle)
.background(Color.blue)
}
}.font(.largeTitle)
}
.padding()
}
}
9、LazyHGrid (懒加载水平网格布局)(iOS 14.0才可使用)
控件显示到屏幕里才会加载
import SwiftUI
struct ContentView : View {
var body: some View {
let rows: [GridItem] =
Array(repeating: .init(.fixed(50)), count: 2)
ScrollView(.horizontal) {
LazyHGrid(rows: rows, alignment: .top) {
ForEach((0...79), id: \.self) {
let codepoint = $0 + 0x1f600
let emoji = String(Character(UnicodeScalar(codepoint)!))
Text("\(emoji)")
.font(.largeTitle)
.background(Color.blue)
}
}
}
.padding()
}
}