swift - 为什么alignmentGuide 对垂直和水平的行为不同?
问题描述
为什么当增加水平对齐时,红色圆圈(被对齐的东西)相对于它的“原始点”移动,但是当垂直对齐增加时,“原始点”相对于圆圈移动?
另外,为什么在水平对齐时对齐会扩展VStack
,但是当增加垂直对齐时,VStack
不会扩展。
struct CircleOffsetView: View {
let alignment: Alignment = .center
let relative: UnitPoint = .center
@State var widthOffset: CGFloat = 0.0
@State var heightOffset: CGFloat = 0.0
var body: some View {
VStack {
Circle()
.foregroundColor(.red)
.frame(width: 200, height: 200)
.alignmentGuide(alignment.horizontal, computeValue: { dimension in
dimension.width / 2 + widthOffset
})
.alignmentGuide(alignment.vertical, computeValue: { dimension in
dimension.height / 2 + heightOffset
})
.border(Color.black)
Text("Width Offset: \(widthOffset)")
Text("Height Offset: \(heightOffset)")
Slider(value: $widthOffset, in: -150...150).padding()
Slider(value: $heightOffset, in: -150...150).padding()
Button("Reset") {
widthOffset = 0
heightOffset = 0
}.padding()
}
.padding()
.border(Color.red, width: 5)
.padding()
}
}
解决方案
alignmentGuide
旨在根据父级HStack
或VStack
对齐更改偏移量。对于您的第一个参数,alignmentGuide
您应该只传递父容器的对齐方式以使其工作。
在这种情况下VStack
,默认值为Alignment.center.vertical
,这就是您的第一个alignmentGuide
工作的原因。如果添加显式VStack(alignment: .leading)
,甚至Alignment.center.vertical
也不会生效。
alignmentGuide
withAlignment.center.horizontal
只会在里面工作HStack(alignment: .center)
。
HStack(alignment: .center) {
Circle()
.foregroundColor(.red)
.frame(width: 200, height: 200)
.border(Color.black)
.alignmentGuide(Alignment.center.horizontal, computeValue: { dimension in
dimension.width / 2 + widthOffset
})
.alignmentGuide(Alignment.center.vertical, computeValue: { dimension in
dimension.height / 2 + heightOffset
})
VStack {
Text("Width Offset: \(widthOffset)")
Text("Height Offset: \(heightOffset)")
Slider(value: $widthOffset, in: -150...150).padding()
Slider(value: $heightOffset, in: -150...150).padding()
Button("Reset") {
widthOffset = 0
heightOffset = 0
}.padding()
}
}
.padding()
.border(Color.red, width: 5)
.padding()
查看本文中的对齐指南
我不确定为什么border
在你的情况下会被移动,可能是它在HStack
内部使用来构建自己。
就 a 内的垂直偏移而言,VStack
您的预期结果不是很清楚。
- 您可以使用 移动您的项目
.offset
,但在这种情况下,视图将超出范围:
Circle()
.foregroundColor(.red)
.frame(width: 200, height: 200)
.border(Color.black)
.offset(x: widthOffset, y: heightOffset)
- 如果您需要垂直移动视图以影响边界,可以使用两个垫片:
Spacer(minLength: 0).frame(height: max(0, heightOffset))
Circle()
.foregroundColor(.red)
.frame(width: 200, height: 200)
.border(Color.black)
.alignmentGuide(Alignment.center.horizontal, computeValue: { dimension in
dimension.width / 2 + widthOffset
})
Spacer(minLength: 0).frame(height: max(0, -heightOffset))
- 您希望看到的其他结果?
推荐阅读
- powerbi - 如何统计ALL返回的成员
- python - R中的循环交互
- javascript - Bootstrap 4中输入字段相邻的标签没有响应
- javascript - 如何使用javascript在单击父行时使子行可见
- apache-kafka - 卡夫卡与 Kerberos
- xamarin - 绑定更改时 XAML 视图未更新
- gradle - Gradle 包装器在构建时找不到 javafx,内置 gradle 在构建时可以正常工作
- python - Tkinter 无法更新标签文本
- android - 如何在 android 中使用房间数据库更改 LiveData 可观察查询参数?
- typescript - 如何在打字稿中计算时区选择的日期时间