SwiftUI
中的约束现在发生了什么? View
类型会自动适应较大的设备等吗?还是我们应该怎么做?
答案 0 :(得分:14)
SwiftUI 不使用布局约束。 UIKit 仍然存在,它尚未被弃用且功能齐全,因此,如果继续使用经典方法,则可以根据需要使用任意数量的约束。
但是,如果您选择使用 SwiftUI →安息,约束!
使视图彼此对齐的核心概念是使用堆栈:
如果要覆盖视图(即将一个视图放在另一个视图之上),可以使用
View 协议本身(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
并通过设置堆栈视图的width→完成的任务来控制实际宽度。 ✅但是,如果不是这样(例如,当它们处于水平堆栈中时),则必须找到其他方式来表示。实际的实现取决于您要描述的具体布局。
SwiftUI 的一般思想是使视图尽可能小并进行组合。这里有一些折衷:您付出的代价是,在不同视图层次结构中的视图之间的“约束”变得更加冗长了实现,最终的好处是布局是声明性的,而创建最常见用户界面的代码是大大简化。
默认情况下,自定义视图会填满整个可用空间,这意味着最上面的视图会自动填满整个屏幕-无论实际屏幕大小如何。您可以使用修饰符更改该行为。
答案 1 :(得分:4)
它仍然有约束,在WWDC示例中,我们看到了HStack
和VStack
,看起来像UIStackView
,所以我们猜想它只是剪切到边缘。您仍然可以在视图中添加填充,因此,如果要向左约束UILabel
(文本)10pt,您可以执行以下操作:
Text("Hello World").padding(EdgeInsets.init(top: 0, leading: 10, bottom: 0, trailing: 0))
答案 2 :(得分:0)
约束已经很好了,这很好,但是有一个叫做.padding()的东西,它可以通过在左边加上诸如前导参数之类的东西来进行某种约束外观,使图像进入视图的侧面
struct ContentView: View {
var body: some View {
Image("x")
.padding(.leading)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}