约束中现在发生了SwiftUI
什么?难道View
类型自动适应更大的设备等,或者我们应该要做的呢?
SwiftUI不使用布局约束。UIKit仍然存在,它尚未被弃用且功能齐全,因此,如果继续使用经典方法,则可以根据需要使用任意数量的约束。
但是,如果你选择使用SwiftUI →安心,就束手无策!
使视图彼此对齐的核心概念是使用堆栈:
如果你想覆盖视图(即,将一个视图放在另一个视图之上),则可以使用
View协议本身(所有视图类型都神秘地遵循该协议)具有大量称为修饰符的功能,可用于自定义视图的布局。
以下是一些示例,与使用约束相比,如何使用这些修饰符来实现特定的布局:
代替
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的总体思想是保持视图尽可能小并进行组合。这里有一些折衷:你付出的代价是,在不同视图层次结构中的视图之间的“约束”变得更加冗长了实现,最终的好处是布局是声明性的,而创建最常见用户界面的代码是大大简化。
自定义视图默认情况下会填满整个可用空间,这意味着最上面的视图会自动填满整个屏幕-无论实际屏幕大小如何。你可以使用修饰符来更改该行为。
换句话说,约束仍然存在,但是SwiftUI会生成约束。
@Sulthan不一定。SwiftUI是专用框架,例如UIKit。但是,由于SwiftUI是beta版,因此它仍然使用许多UIKit组件,因此,通常看来SwiftUI是高级UIKit API。但是最终,SwiftUI将完全独立于UIKit,而其背后却是自己的方法。
如何在VStack上将contentMode设置为.fill?找不到适合的修饰符
我认为swiftUI仍在使用上下文菜单之类的约束。stackoverflow.com/questions/59254236/…
如果很难使两个彼此水平放置的按钮具有相同的宽度,那么我认为“将大大简化创建最常用的用户界面的代码”是我的观点。