Как сделать просмотр размера другого представления в SwiftUI: 2020 - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь использовать решение здесь, чтобы воссоздать точно такой же тип решения для опубликованной проблемы этого человека. Предполагаемое решение можно увидеть в моем коде ниже / или по ссылке ниже. Однако они не работают, говоря, что я использую «необъявленный тип« Длина »». Этот вопрос задавался 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()
}
}
...