如何在 SwiftUI 中相对于左上角定位视图
How To Position Views Relative To Their Top Left Corner In SwiftUI
如何在 swiftUI 中相对于视图的左上角定位视图? "position" 修饰符相对于它们的中心坐标移动视图。所以 .position(x: 0, y: 0)
在屏幕的左上角放置一个视图中心坐标。
我想在屏幕的左上角放置一个视图的左上角坐标,我该怎么做?
struct HomeView: View {
var body: some View {
VStack(alignment: .leading) {
Text("Top Text")
.font(.system(size: 20))
.fontWeight(.medium)
Text("Bottom Text")
.font(.system(size: 12))
.fontWeight(.regular)
}
.position(x: 0, y: 0)
}
}
目前,我的视图的左半部分被屏幕截断了,我该如何防止这种情况发生?另外,如何相对于安全区域对齐?
我想念 UIKit
如果我正确理解了您的目标,那么 .position
不是适合它的工具。 SwiftUI 布局在没有硬编码的情况下效果更好。
这是可能的解决方案。使用 Xcode 11.4 / iOS 13.4
测试
struct HomeView: View {
var body: some View {
ZStack(alignment: .topLeading) {
Color.clear
VStack(alignment: .leading) {
Text("Top Text")
.font(.system(size: 20))
.fontWeight(.medium)
Text("Bottom Text")
.font(.system(size: 12))
.fontWeight(.regular)
}
}.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
@Asperi 的回答会解决问题。但是,我认为我们应该使用 Spacer()
而不是 Color.clear
和 ZStack
。
Spacer
就是专门针对这些场景设计的,让代码更容易理解。
struct HomeView: View {
var body: some View {
HStack {
VStack(alignment: .leading) {
Text("Top Text")
.font(.system(size: 20))
.fontWeight(.medium)
Text("Bottom Text")
.font(.system(size: 12))
.fontWeight(.regular)
Spacer()
}
Spacer()
}
}
}
SwiftUI 布局系统与 UIKit 不同。
它要求每个 child 视图根据其 parent 视图的边界计算自己的大小。接下来,要求每个 parent 将其 children 定位在自己的范围内。
https://www.hackingwithswift.com/books/ios-swiftui/how-layout-works-in-swiftui
您可以使用:
offset(x: CGFloat = 0, y: CGFloat = 0) -> some View
因此您将相对于当前对象位置。
如何在 swiftUI 中相对于视图的左上角定位视图? "position" 修饰符相对于它们的中心坐标移动视图。所以 .position(x: 0, y: 0)
在屏幕的左上角放置一个视图中心坐标。
我想在屏幕的左上角放置一个视图的左上角坐标,我该怎么做?
struct HomeView: View {
var body: some View {
VStack(alignment: .leading) {
Text("Top Text")
.font(.system(size: 20))
.fontWeight(.medium)
Text("Bottom Text")
.font(.system(size: 12))
.fontWeight(.regular)
}
.position(x: 0, y: 0)
}
}
目前,我的视图的左半部分被屏幕截断了,我该如何防止这种情况发生?另外,如何相对于安全区域对齐?
我想念 UIKit
如果我正确理解了您的目标,那么 .position
不是适合它的工具。 SwiftUI 布局在没有硬编码的情况下效果更好。
这是可能的解决方案。使用 Xcode 11.4 / iOS 13.4
测试struct HomeView: View {
var body: some View {
ZStack(alignment: .topLeading) {
Color.clear
VStack(alignment: .leading) {
Text("Top Text")
.font(.system(size: 20))
.fontWeight(.medium)
Text("Bottom Text")
.font(.system(size: 12))
.fontWeight(.regular)
}
}.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
@Asperi 的回答会解决问题。但是,我认为我们应该使用 Spacer()
而不是 Color.clear
和 ZStack
。
Spacer
就是专门针对这些场景设计的,让代码更容易理解。
struct HomeView: View {
var body: some View {
HStack {
VStack(alignment: .leading) {
Text("Top Text")
.font(.system(size: 20))
.fontWeight(.medium)
Text("Bottom Text")
.font(.system(size: 12))
.fontWeight(.regular)
Spacer()
}
Spacer()
}
}
}
SwiftUI 布局系统与 UIKit 不同。
它要求每个 child 视图根据其 parent 视图的边界计算自己的大小。接下来,要求每个 parent 将其 children 定位在自己的范围内。
https://www.hackingwithswift.com/books/ios-swiftui/how-layout-works-in-swiftui
您可以使用:
offset(x: CGFloat = 0, y: CGFloat = 0) -> some View
因此您将相对于当前对象位置。