Вы можете просто получить два Text
с, а затем Spacer
в HStack
.Spacer
будет сдвигать ваши Text
с влево, и все будет самонастраиваться, если Text
s изменит размер из-за длины их содержимого:
HStack {
Text("1.")
Text("John Doe")
Spacer()
}
.padding()
![enter image description here](https://i.stack.imgur.com/pnU9h.png)
Text
s технически выровнены по центру, но так как размеры автоматически изменяются и занимают столько же места, сколько текст внутри него (поскольку мы явно не устанавливали рамкуразмер), и Spacer
сдвигаются влево, они выглядят выровненными по левому краю.Преимущество этого по сравнению с установкой фиксированной ширины заключается в том, что вам не нужно беспокоиться о том, что текст обрезается.
Кроме того, я добавил отступ к HStack
, чтобы он выглядел лучше, но если вы хотитеОтрегулируйте, насколько близко Text
s друг к другу, вы можете вручную установить отступы с любой из его сторон.(Вы можете даже установить отрицательное заполнение, чтобы подтолкнуть элементы ближе друг к другу, чем их естественный интервал).
Редактировать
Не понимал, что OP нужен второй Text
быть вертикально выровненным также.У меня есть способ сделать это, но он «хакерский» и не будет работать для больших размеров шрифта без дополнительной работы:
Это объекты данных:
class Person {
var name: String
var id: Int
init(name: String, id: Int) {
self.name = name
self.id = id
}
}
class People {
var people: [Person]
init(people: [Person]) {
self.people = people
}
func maxIDDigits() -> Int {
let maxPerson = people.max { (p1, p2) -> Bool in
p1.id < p2.id
}
print(maxPerson!.id)
let digits = log10(Float(maxPerson!.id)) + 1
return Int(digits)
}
func minTextWidth(fontSize: Int) -> Length {
print(maxIDDigits())
print(maxIDDigits() * 30)
return Length(maxIDDigits() * fontSize)
}
}
ЭтоView
:
var people = People(people: [Person(name: "John Doe", id: 1), Person(name: "Alexander Jones", id: 2000), Person(name: "Tom Lee", id: 45)])
var body: some View {
List {
ForEach(people.people.identified(by: \.id)) { person in
HStack {
Text("\(person.id).")
.frame(minWidth: self.people.minTextWidth(fontSize: 12), alignment: .leading)
Text("\(person.name)")
}
}
}
}
Чтобы он работал для шрифтов разных размеров, вам нужно будет получить размер шрифта и передать его в minTextWidth(fontSize:)
.
Опять же, я быХотелось бы подчеркнуть, что это «хакерство» и, вероятно, идет вразрез с принципами SwiftUI, но я не смог найти встроенный способ сделать макет, который вы просили (вероятно, потому что Text
в разных строках не взаимодействуют друг с другом,поэтому они не могут знать, как оставаться вертикально выровненными друг с другом).
Редактировать 2 Приведенный выше код генерирует это:
![Code result](https://i.stack.imgur.com/AzoW6m.png)