SwiftUI不使用布局约束.UIKit仍然存在,它没有被弃用,功能齐全,因此如果继续使用classic 方法,可以使用任意多的约束.
然而,如果你 Select SwiftUI→ 安息吧!
将视图彼此对齐的核心概念是使用堆栈:
如果要覆盖视图(即将一个视图置于另一个视图之上),可以使用
100协议本身(to which all view types mysteriously conform)有大量名为modifiers的函数,可以用来定制视图的布局.
以下是一些示例,与使用约束相比,如何使用这些修改器实现特定布局:
而不是
view.widthAnchor.constraint(equalTo: view.heightAnchor, multiplier: 2)
UIKit年后你会写
view
.aspectRatio(2, contentMode: .fit)
SwiftUI年后.
而不是
view2.leadingAnchor.constraint(equalTo: view1.leadingAnchor, constant: 8)
在UIKit中,可以将视图排列成水平堆栈,并在它们之间添加一个间隔,然后添加frame
修改器以指定其宽度:
HStack {
view1
Spacer()
.frame(width: 30)
view2
}
这就是问题变得更复杂的地方.不能再指定两个视图的宽度相等.如果它们在同一个垂直堆栈中(即在垂直线上对齐),很好:只需将contentMode
设置为.fill
,并通过设置堆栈视图的宽度来控制实际宽度→ 任务完成了.✅ 但如果它们不是(例如,当它们处于水平堆栈中时),则必须找到其他方式来表达.实际实现将取决于您试图描述的具体布局.
尽可能少地构思SwiftUI个总体视图.这里有一个小小的权衡:你付出的代价是,不同视图层次 struct 中的视图之间的"约束"要实现得更加详细,最终的好处是布局是声明性的,创建最常见用户界面的代码大大简化.
默认情况下,自定义视图会填充整个可用空间,这意味着最顶端的视图会自动填充整个屏幕,而与实际屏幕大小无关.你可以用modifiers来改变这种行为.