SwiftUI GeometryReader возвращает 0,0 для размера содержимого ScrollView при первоначальном рендерингеIOS

Программируем под IOS
Ответить
Anonymous
 SwiftUI GeometryReader возвращает 0,0 для размера содержимого ScrollView при первоначальном рендеринге

Сообщение Anonymous »

Я пытаюсь получить размер содержимого ScrollView при первоначальном рендеринге представления, но он возвращает 0,0 вместо фактического размера. Чтобы попытаться добиться этого, я создал представление ChildSizeReader после этого сообщения, и код выглядит следующим образом:
ChildSizeReader:

Код: Выделить всё

struct ChildSizeReader: View {
@Binding var size: CGSize

let content: () -> Content

var body: some View {
ZStack {
content()
.background(
GeometryReader { proxy in
Color.clear
.preference(key: SizePreferenceKey.self, value: proxy.size)
}
)
}
.onPreferenceChange(SizePreferenceKey.self) { sizeValue in
size = sizeValue
}
}
}

struct SizePreferenceKey: PreferenceKey {
typealias Value = CGSize
static var defaultValue: Value = .zero

static func reduce(value _: inout Value, nextValue: () -> Value) {
_ = nextValue()
}
}
Использование ChildSizeReader:

Код: Выделить всё

@State private var scrollViewSize: CGSize = .zero

...

ScrollViewReader { proxy in
ScrollView(.vertical) {
ChildSizeReader(size: $scrollViewSize) {
FeatureSet(features: features)
}
}
}
Набор функций:

Код: Выделить всё

struct FeatureSet: View {
var features: [Feature]

var body: some View {
LazyVStack {
ForEach(Array(features.enumerated()), id: \.element.title) { index, feature in
FeatureRow(title: feature.title, value: feature.value)
.id(feature.title)

if index != features.count - 1 {
Divider()
.frame(height: 1)
.overlay(Color(hex: 0x808080, opacity: 0.2))
}
}
}
}
}
Я также попробовал обернуть Color.clear.preference в условный оператор if proxy.size != .zero, как показано на этом форуме, но размер по-прежнему был равен 0,0, когда он был присвоен размеру.
Но в тот момент, когда я начинаю прокрутку, размер устанавливается на ожидаемое значение.
Есть ли какие-нибудь идеи о том, как получить правильный размер ScrollView при первоначальном рендеринге? Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/792 ... itial-rend
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»