Я пытаюсь использовать решение здесь, чтобы воссоздать точно такой же тип решения для опубликованной проблемы этого человека. Предполагаемое решение можно увидеть в моем коде ниже / или по ссылке ниже. Однако они не работают, говоря, что я использую «необъявленный тип« Длина »». Этот вопрос задавался 7 месяцев go, поэтому я уверен, что это как-то связано с новыми методами использования различного синтаксиса в SwiftUI
Как настроить размер другого представления в SwiftUI
Текст из старой проблемы говорит: «Я пытаюсь воссоздать часть приложения Twitter iOS, чтобы изучить SwiftUI, и мне интересно, как динамически изменить ширину одного вида, чтобы она стала шириной другой вид. В моем случае, чтобы подчеркивание было такой же ширины, как текстовое представление. "
import SwiftUI
extension HorizontalAlignment {
private enum UnderlineLeading: AlignmentID {
static func defaultValue(in d: ViewDimensions) -> Length {
return d[.leading]
}
}
static let underlineLeading = HorizontalAlignment(UnderlineLeading.self)
}
struct GridViewHeader : View {
@State private var activeIdx: Int = 0
@State private var w : [Length] = [0, 0, 0, 0]
var body: some View {
return VStack(alignment: .underlineLeading) {
HStack {
Text("Tweets").modifier(MagicStuff(activeIdx: $activeIdx, widths: w, idx: 0))
Spacer()
Text("Tweets & Replies").modifier(MagicStuff(activeIdx: $activeIdx, widths: w, idx: 1))
Spacer()
Text("Media").modifier(MagicStuff(activeIdx: $activeIdx, widths: w, idx: 2))
Spacer()
Text("Likes").modifier(MagicStuff(activeIdx: $activeIdx, widths: w, idx: 3))
}
.frame(height: 50)
.padding(.horizontal, 10)
Rectangle()
.alignmentGuide(.underlineLeading) { d in d[.leading] }
.frame(width: w[activeIdx], height: 2)
.animation(.basic())
}
}
}
struct MagicStuff: ViewModifier {
@Binding var activeIdx: Int
@Binding var widths: [Length]
let idx: Int
func body(content: Content) -> some View {
Group {
if activeIdx == idx {
content.alignmentGuide(.underlineLeading) { d in
DispatchQueue.main.async { self.widths[self.idx] = d.width }
return d[.leading]
}.onTapGesture { self.activeIdx = self.idx }
} else {
content.onTapGesture { self.activeIdx = self.idx }
}
}
}
}
struct GridViewHeader_Previews: PreviewProvider {
static var previews: some View {
GridViewHeader()
}
}