Сократить межстрочный интервал действительно сложно, попробуйте
struct ContentView: View {
@State var data : [String] = ["first","second","3rd","4th","5th","6th"]
var body: some View {
VStack {
ScrollView {
ForEach(data, id: \.self) { item in
VStack(alignment: .leading, spacing: 0) {
Color.red.frame(height: 1)
Text("\(item)").font(.largeTitle)
.background(Color.yellow)
}.background(Color.green)
.padding(.leading, 10)
.padding(.bottom, -25)
.frame(maxWidth: .infinity)
}
}
}
}
}
Он использует ScrollView вместо List и отрицательного заполнения.
Я не нашел решения, основанного на List, мы должны попросить Apple опубликовать sh xxxxStyle протоколов и базовых структур.
UPDATE
Как насчет этого отрицательного значения заполнения? Конечно, это зависит от высоты содержимого строки и, к сожалению, от стратегии компоновки SwiftUI. Давайте попробуем еще немного динамического c контента! (мы используем нулевое заполнение для демонстрации решаемой задачи)
struct ContentView: View {
@State var data : [CGFloat] = [20, 30, 40, 25, 15]
var body: some View {
VStack {
ScrollView {
ForEach(data, id: \.self) { item in
VStack(alignment: .leading, spacing: 0) {
Color.red.frame(height: 1)
Text("\(item)").font(.system(size: item))
.background(Color.yellow)
}.background(Color.green)
.padding(.leading, 10)
//.padding(.bottom, -25)
.frame(maxWidth: .infinity)
}
}
}
}
}
Очевидно, что расстояние между строками не является фиксированным значением! Мы должны рассчитать его для каждой строки отдельно.
Следующий фрагмент кода демонстрирует основную идею c. Я использовал глобальный словарь (для хранения высоты и положения каждой строки) и старался избегать каких-либо функций высокого порядка и / или некоторой продвинутой техники SwiftUI c, поэтому стратегию легко увидеть. Необходимые отступы рассчитываются только один раз, при закрытии .onAppear
import SwiftUI
var _p:[Int:(CGFloat, CGFloat)] = [:]
struct ContentView: View {
@State var data : [CGFloat] = [20, 30, 40, 25, 15]
@State var space: [CGFloat] = []
func spc(item: CGFloat)->CGFloat {
if let d = data.firstIndex(of: item) {
return d < space.count ? space[d] : 0
} else {
return 0
}
}
var body: some View {
VStack {
ScrollView {
ForEach(data, id: \.self) { item in
VStack(alignment: .leading, spacing: 0) {
Color.red.frame(height: 1)
Text("\(item)")
.font(.system(size: item))
.background(Color.yellow)
}
.background(
GeometryReader { proxy->Color in
if let i = self.data.firstIndex(of: item) {
_p[i] = (proxy.size.height, proxy.frame(in: .global).minY)
}
return Color.green
}
)
.padding(.leading, 5)
.padding(.bottom, -self.spc(item: item))
.frame(maxWidth: .infinity)
}.onAppear {
var arr:[CGFloat] = []
_p.keys.sorted(by: <).forEach { (i) in
let diff = (_p[i + 1]?.1 ?? 0) - (_p[i]?.1 ?? 0) - (_p[i]?.0 ?? 0)
if diff < 0 {
arr.append(0)
} else {
arr.append(diff)
}
}
self.space = arr
}
}
}
}
}
Выполнение кода, который я получил