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

推荐答案

瑞普,约束!

SwiftUI不使用布局约束.UIKit仍然存在,它没有被弃用,功能齐全,因此如果继续使用classic 方法,可以使用任意多的约束.

然而,如果你 Select SwiftUI→ 安息吧!

Tomb Stone with

将视图彼此对齐的核心概念是使用堆栈:

  • 100
  • 100

如果要覆盖视图(即将一个视图置于另一个视图之上),可以使用

  • 100

100协议本身(to which all view types mysteriously conform)有大量名为modifiers的函数,可以用来定制视图的布局.


例子

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

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个总体视图.这里有一个小小的权衡:你付出的代价是,不同视图层次 struct 中的视图之间的"约束"要实现得更加详细,最终的好处是布局是声明性的,创建最常见用户界面的代码大大简化.


屏幕自适应/响应

默认情况下,自定义视图会填充整个可用空间,这意味着最顶端的视图会自动填充整个屏幕,而与实际屏幕大小无关.你可以用modifiers来改变这种行为.

Swift相关问答推荐

带有文本输入自动大小写修饰符的SwiftUI Textfield问题

如何使用变量 Select 哪个向量(?)在我的 struct 中密谋吗?

调度组是否阻止iOS中的主线程?

为什么无法在 Swift 中使用AVFoundation扫描 QRCode

URL appendPathComponent(_:) 已弃用?

将每个枚举 case 与 Swift 中的一个类型相关联

Swift-SceneKit-无法从art.scnassets加载.scn文件

从 Int 到 String 的属性更改引发 SwiftUI 视图不更新

如何在 Swift 中对单个单词进行词形还原

Swift 全局函数列表

如何让动画变慢 SwiftUI

SwiftUI:从存储在 observableObject 中的数组中删除对象时查看崩溃

Swift:连接两个数组而不重复共享后缀/前缀

Xcode 13.3 将函数调用更改为属性访问

Swift 函数 vs 惰性变量 vs 计算(computed)属性 - 区别?

如何在 SwiftUI 中实现 PageView?

NSFontAttributeName 已更改为 String

Swift 2 中的新 @convention(c):我该如何使用它?

为 UIImagePicker 设置委托返回错误

Xcode 和 Swift - 没有标题栏但有关闭、最小化和调整大小按钮的窗口