swift - SwiftUI - 设置视图框架
问题描述
当我学习 SwiftUI(beta 6)之类的新东西时,我想从基础开始。
我只想像在 UIKit 中一样将框架设置为子视图。我在这里缺少什么?(这是来自模拟器)
1.子视图不在0,0位置。
2.为什么至少单词的开头不在边界内?
更新:
如何在 0,0 位置设置文本视图?(就像在 UIKit 上一样)
我认为我的问题很清楚,但由于某种原因,事实并非如此。
解决方案
我认为了解为什么您的解决方案不起作用很重要,因为乍一看它似乎是正确的,而且 SwiftUI 似乎以一些奇怪的方式工作(因为,当然,我们都习惯了UIKit
)。你试过:
struct ContentView: View {
var body: some View {
VStack {
Text("Hello World")
.position(CGPoint(x: 0, y: 0))
.frame(width: 50, height: 100)
.border(Color.red, width: 4)
}
}
}
你得到了:
首先,position
修饰符说:
将视图的中心固定在其父级坐标空间中的指定点。
这里有两件事很重要:
- 视图基于其中心移动,而不是基于其左上角
- 视图在父级坐标空间中移动
但谁是文本的父母?SwiftUI 中的Aview modifier
是适用于 aView
并返回 a 的东西View
。修饰符从最后一个应用到第一个(与您看到它们的顺序相反)。在你的情况下:
所以: 的中心相对于50x100 的红色Text
位于 (0,0) 处。由于(这是默认行为),生成的视图被放置在屏幕的中心。换句话说:的父级(返回 a ,每个修饰符返回 a )是放置在屏幕中心的 50x100。Frame
Border
VStack
VStack
position
position
View
View
Frame
Text
如果要将at (0,0) 的左上角定位在Frame
坐标空间中,则应以Spacer
这种方式使用修饰符:
struct ContentView: View {
var body: some View {
VStack {
Text("Hello World")
Spacer()
}
.frame(width: 50, height: 100)
.border(Color.red, width: 4)
}
}
你会得到:
Frame
相反,如果您想要,相对于整体而言,左上角位于 (0,0) 处,View
我认为最简单的方法是:
struct ContentView: View {
var body: some View {
HStack {
VStack {
Text("Hello World")
.frame(width: 50, height: 100)
.border(Color.red, width: 4)
Spacer()
}
Spacer()
}
.edgesIgnoringSafeArea(.all)
}
}
你会得到:
推荐阅读
- javascript - 无法通过选择 api 在空格后选择刚刚写的单词
- or-tools - 如何获取ortools返还成本?
- performance - 具有最佳界限的大型 MILP = B&B 每个节点的目标值,为什么求解器不接受该解决方案?
- c# - 通过反射获取带有“in”参数的方法
- php - 请求数据表错误中第 0 行的未知参数“prog_name”
- mysql - 如何将两个模型与续集关联?(1:n) 和 (m:n)
- swift - 从 C# Azure Web 应用程序向前台 iOS 和 Android 应用程序发送静默实时事件更新
- spring-webflux - Spring RSocket:未提取元数据的@DestinationVariable(不使用WebSockets)
- python - 将字典中的键添加到另一个字典(来自 .csv 文件)
- reactjs - react-transition-group CSSTransition 是如何工作的?