Простая ошибка SwiftUI View при использовании заголовка UICollectionViewFlowLayoutIOS

Программируем под IOS
Ответить
Anonymous
 Простая ошибка SwiftUI View при использовании заголовка UICollectionViewFlowLayout

Сообщение Anonymous »


Я создаю простое представление с содержимым в виде прокрутки и верхним заголовком. Когда пользователь прокручивает вниз, я хочу скрыть заголовок, а когда пользователь прокручивает вверх, я хочу его показать. У меня есть три разные вкладки, и если я вручную перемещаюсь между ними, все работает нормально. Если я попытаюсь нажать кнопки в заголовке для переключения вкладок, представление прокрутки немного подкорректирует представление прокрутки и ничего не сделает, то я получу массу ошибок ниже.

Код работает, когда (или или)
[*]удаление .ignoresSafeArea(edges: .top) решает проблему [*]Удаление TabView и использование условного рендеринга для отображения вкладок.
Я хочу сохранить функциональность режима игнорирования и просмотра вкладок. Как мне это обойти?
Поведение UICollectionViewFlowLayout не определено, поскольку: высота элемента должна быть меньше высоты UICollectionView минус верхние и нижние значения вставки раздела, минус верхние и нижние значения вставки содержимого< /п> импортировать SwiftUI структура FeedViewSec: Просмотр { @Environment(\.colorScheme) var colorScheme Выбор частной переменной @State = 0 @State var headerHeight: CGFloat = 130 @State var headerOffset: CGFloat = 0 @State varlastHeaderOffset: CGFloat = 0 @State переменное направление: SwipeDirection = .none @State varshiftOffset: CGFloat = 0 var body: some View { Навигационный стек { ZStack(выравнивание: .bottomTrailing){ TabView(выбор: $выбор) { прокруткаBody().tag(0) прокруткаBody().tag(1) прокруткаBody().tag(2) }.tabViewStyle(PageTabViewStyle(indexDisplayMode: .never)) } .overlay(выравнивание: .top) { headerView().offset(y: -headerOffset ())->некоторый вид{ self.modifier(OffsetHelper(onChange: завершение)) } функция SafeArea()->UIEdgeInsets{ охранник пусть сцена = UIApplication.shared.connectedScenes.first как? UIWindowScene еще {возврат .ноль} Guard let SafeArea = Scene.windows.first?.safeAreaInsets еще {return .zero} вернуть безопасную область } } структура OffsetHelper: ViewModifier{ var onChange: (CGFloat,CGFloat)->() @State var currentOffset: CGFloat = 0 @State var previousOffset: CGFloat = 0 тело функции (содержание: Содержание) -> некоторый вид { содержание .оверлей { GeometryReader{прокси в let minY = proxy.frame(in: .named("SCROLL")).minY Цвет.прозрачный .preference(ключ: OffsetKeyNew.self, значение: minY) .onPreferenceChange(OffsetKeyNew.self) {значение в предыдущийСмещение = ТекущееСмещение текущееСмещение = значение onChange(предыдущееСмещение,текущееСмещение) } } } } } структура OffsetKeyNew: PreferenceKey{ статическая переменная defaultValue: CGFloat = 0 статическая функция уменьшения (значение: inout CGFloat, nextValue: () -> CGFloat) { значение = следующееЗначение() } } структура HeaderBoundsKey: PreferenceKey{ статическая переменная defaultValue: Anchor? статическая функция уменьшения (значение: inout Anchor?, nextValue: () -> Anchor?) { значение = следующееЗначение() } } перечисление SwipeDirection { дело вверх дело закрыто случай нет }
Ответить

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

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

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

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

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