SwiftUI:如何根据另一个元素的位置对齐元素的填充值
SwifUI: How do I align padding value of an element based on position of another element
如何对齐 SwiftUI 中 VStack 中包含的两个不同 HStack 中的元素?
这是我正在尝试做的事情 -
VStack {
HStack {
element A - Text
element B - Image
element C - Image
}
HStack {
element D - Text
element E - Text
}
}
如何根据第一个 HStack 中 'Text element A' 的中心轴对齐第二个 HStack 中的 'Text element D'?
如果我在所有封闭的 VStack 上使用 .center 对齐方式,它会对齐 HStack,但不会对齐各个元素
提前致谢!
编辑 1:
@E.coms
根据您的意见,这就是我正在做的
enter code here
import SwiftUI
struct ContentView2: View {
var body: some View {
VStack(alignment: .center) {
Image(systemName: "photo")
.padding(.bottom, 10)
VStack(alignment: .midNameAndDate) {
HStack{
Text("Name")
.padding(.trailing, 100)
.alignmentGuide(.midNameAndDate, computeValue: { v in v[HorizontalAlignment.center] })
Image(systemName: "phone")
.padding(.trailing, 20)
Image(systemName: "location")
.padding(.trailing, 40)
}
HStack {
Text("Month day, year")
.padding(.trailing, 40)
Text("00:00 ZM")
.padding(.trailing, 40)
}.alignmentGuide(.midNameAndDate) { v in v[.leading]}
}
}
}
}
struct ContentView2_Previews: PreviewProvider {
static var previews: some View {
ContentView2()
}
}
extension HorizontalAlignment {
private enum MidNameAndDate : AlignmentID {
static func defaultValue(in d: ViewDimensions) -> CGFloat {
return d[.leading]
}
}
static let midNameAndDate = HorizontalAlignment(MidNameAndDate.self)
}
'''
这就是我的结局
这正是我需要的
我是否应该将它们分别拆分为 HStack 中的 VStack?
另一方面,我可以通过将它们拆分为单独的垂直堆栈来对齐它们(即名称和日期在一个垂直堆栈下,Phone,位置和时间在另一个垂直堆栈下。两个垂直堆栈在水平堆栈下)。但是当我想创建这些元素的列表时,这会变得越来越复杂。
我能够在 WWDC 2019 视频中找到有关在不同水平堆栈中对齐 UIelements 的信息,但没有找到有关在不同垂直堆栈中对齐 UIelements 的信息,至少我希望我没有忽略某些东西!
我向您展示了如下示例:
extension HorizontalAlignment {
private enum MyAlignment: AlignmentID {
static func defaultValue(in d: ViewDimensions) -> CGFloat {
return d[.trailing]
}
}
static let myAlignment = HorizontalAlignment(MyAlignment.self)
}
VStack(alignment: .myAlignment) {
HStack {
(element A).alignmentGuide(.myAlignment) { v in v[HorizontalAlignment.center]}
(element B)
(element C)
}
HStack {
(element D)
(element E)
}.alignmentGuide(.myAlignment) { v in v[.leading]}
}
在你最近的例子中,它应该像下面这样:
struct ContentView2: View {
var body: some View {
VStack(alignment: .midNameAndDate) {
Image(systemName: "photo")
.padding(.bottom, 10).alignmentGuide(.midNameAndDate) { v in v[HorizontalAlignment.center]}
VStack(alignment: .midNameAndDate) {
HStack{
Text("Name")
.padding(.trailing, 100)
.alignmentGuide(.midNameAndDate, computeValue: { v in v[HorizontalAlignment.center] + 25 })
Image(systemName: "phone")
.padding(.trailing, 20)
Image(systemName: "location")
.padding(.trailing, 40)
}
HStack {
Text("Month day, year").alignmentGuide(.midNameAndDate) { v in v[.trailing]}
.padding(.trailing, 40)
Text("00:00 ZM")
.padding(.trailing, 40)
}
}
}.frame(maxWidth: .infinity, alignment: .trailing)
}
}
您可以想象自定义的水平对齐是视图元素上的一条线。它们应该在相同的位置,具有相同的 midNameAndDate
。因为您使用的是任意尾随填充,所以您必须在调整中使用常量。
对于容器,使用框架对齐将整个视图定位在任何superView中。
如何对齐 SwiftUI 中 VStack 中包含的两个不同 HStack 中的元素?
这是我正在尝试做的事情 -
VStack {
HStack {
element A - Text
element B - Image
element C - Image
}
HStack {
element D - Text
element E - Text
}
}
如何根据第一个 HStack 中 'Text element A' 的中心轴对齐第二个 HStack 中的 'Text element D'?
如果我在所有封闭的 VStack 上使用 .center 对齐方式,它会对齐 HStack,但不会对齐各个元素
提前致谢!
编辑 1: @E.coms 根据您的意见,这就是我正在做的
enter code here
import SwiftUI
struct ContentView2: View {
var body: some View {
VStack(alignment: .center) {
Image(systemName: "photo")
.padding(.bottom, 10)
VStack(alignment: .midNameAndDate) {
HStack{
Text("Name")
.padding(.trailing, 100)
.alignmentGuide(.midNameAndDate, computeValue: { v in v[HorizontalAlignment.center] })
Image(systemName: "phone")
.padding(.trailing, 20)
Image(systemName: "location")
.padding(.trailing, 40)
}
HStack {
Text("Month day, year")
.padding(.trailing, 40)
Text("00:00 ZM")
.padding(.trailing, 40)
}.alignmentGuide(.midNameAndDate) { v in v[.leading]}
}
}
}
}
struct ContentView2_Previews: PreviewProvider {
static var previews: some View {
ContentView2()
}
}
extension HorizontalAlignment {
private enum MidNameAndDate : AlignmentID {
static func defaultValue(in d: ViewDimensions) -> CGFloat {
return d[.leading]
}
}
static let midNameAndDate = HorizontalAlignment(MidNameAndDate.self)
}
'''
这就是我的结局
这正是我需要的
我是否应该将它们分别拆分为 HStack 中的 VStack?
另一方面,我可以通过将它们拆分为单独的垂直堆栈来对齐它们(即名称和日期在一个垂直堆栈下,Phone,位置和时间在另一个垂直堆栈下。两个垂直堆栈在水平堆栈下)。但是当我想创建这些元素的列表时,这会变得越来越复杂。
我能够在 WWDC 2019 视频中找到有关在不同水平堆栈中对齐 UIelements 的信息,但没有找到有关在不同垂直堆栈中对齐 UIelements 的信息,至少我希望我没有忽略某些东西!
我向您展示了如下示例:
extension HorizontalAlignment {
private enum MyAlignment: AlignmentID {
static func defaultValue(in d: ViewDimensions) -> CGFloat {
return d[.trailing]
}
}
static let myAlignment = HorizontalAlignment(MyAlignment.self)
}
VStack(alignment: .myAlignment) {
HStack {
(element A).alignmentGuide(.myAlignment) { v in v[HorizontalAlignment.center]}
(element B)
(element C)
}
HStack {
(element D)
(element E)
}.alignmentGuide(.myAlignment) { v in v[.leading]}
}
在你最近的例子中,它应该像下面这样:
struct ContentView2: View {
var body: some View {
VStack(alignment: .midNameAndDate) {
Image(systemName: "photo")
.padding(.bottom, 10).alignmentGuide(.midNameAndDate) { v in v[HorizontalAlignment.center]}
VStack(alignment: .midNameAndDate) {
HStack{
Text("Name")
.padding(.trailing, 100)
.alignmentGuide(.midNameAndDate, computeValue: { v in v[HorizontalAlignment.center] + 25 })
Image(systemName: "phone")
.padding(.trailing, 20)
Image(systemName: "location")
.padding(.trailing, 40)
}
HStack {
Text("Month day, year").alignmentGuide(.midNameAndDate) { v in v[.trailing]}
.padding(.trailing, 40)
Text("00:00 ZM")
.padding(.trailing, 40)
}
}
}.frame(maxWidth: .infinity, alignment: .trailing)
}
}
您可以想象自定义的水平对齐是视图元素上的一条线。它们应该在相同的位置,具有相同的 midNameAndDate
。因为您使用的是任意尾随填充,所以您必须在调整中使用常量。
对于容器,使用框架对齐将整个视图定位在任何superView中。