43

现在发生了什么限制SwiftUI?类型是否会View自动适应更大的设备等,或者我们应该做什么?

4

3 回答 3

78

RIP,约束!

SwiftUI不使用布局约束。UIKit仍然存在,它没有被弃用并且功能齐全,所以如果你继续使用经典的方法,你可以使用尽可能多的约束。

但是,如果您选择使用SwiftUI → 安息吧,约束!

墓碑与

使视图相互对齐的核心概念是使用堆栈:

如果你想覆盖视图(即把一个视图放在另一个之上),你可以使用

View协议本身(所有视图类型都神秘地遵循)有大量称为修饰符的函数,您可以使用它们来自定义视图的布局。


例子

以下是一些示例,与使用约束相比,如何使用这些修饰符实现特定布局:

1. 纵横比

代替

view.widthAnchor.constraint(equalTo: view.heightAnchor, multiplier: 2)

UIKit你会写

view
    .aspectRatio(2, contentMode: .fit)

SwiftUI中。

2. 视图之间的间距

代替

view2.leadingAnchor.constraint(equalTo: view1.leadingAnchor, constant: 8)

UIKit中,您可以将视图排列在水平堆栈中,并在它们之间添加一个分隔符并添加frame修饰符以指定其宽度:

HStack {
    view1
    Spacer()
        .frame(width: 30)
    view2
}

3. 等宽

这是它变得更加复杂的地方。您不能再指定两个视图具有相等的宽度。如果它们在同一个垂直堆栈中(即在一条垂直线上对齐),很好:只需设置contentMode.fill并通过设置堆栈视图的宽度来控制实际宽度→任务完成。✅ 但如果它们不是(例如,当它们在水平堆栈中时),你必须找到其他方式来表达它。实际实现将取决于您尝试描述的具体布局。


SwiftUI的总体思路是保持视图尽可能小并组合它们。这里有一点取舍:你付出的代价是不同视图层次结构中的视图之间的“约束”实现起来更加冗长,最终的收获是布局是声明性的,创建最常见用户界面的代码是大大简化。


屏幕适应/响应能力

默认情况下,自定义视图会填满整个可用空间,这意味着最顶部的视图会自动填满整个屏幕——无论实际屏幕大小如何。您可以使用修饰符来更改该行为。

于 2019-06-06T05:29:44.097 回答
9

它仍然有约束,在 WWDC 示例中我们看到HStackVStack,看起来像UIStackView,所以我猜它只是剪辑到边缘。您仍然可以向视图添加填充,因此如果您希望将UILabel(Text) 约束向左 10pt,您可以执行以下操作:

Text("Hello World").padding(EdgeInsets(top: 0, leading: 10, bottom: 0, trailing: 0))
于 2019-06-05T00:12:05.113 回答
0

约束已经很好地消失了,这很好,但是有一个叫做 .padding() 的东西,它可以通过将它放在左侧来做某种约束外观,比如前导参数,使图像转到看法

struct ContentView: View {
   var body: some View {
      Image("x")
         .padding(.leading)
 
        
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

于 2020-11-28T10:48:58.527 回答