Блокировка/устранение прокрутки Наблюдение за клавишей предпочтений в SwiftUIIOS

Программируем под IOS
Ответить
Anonymous
 Блокировка/устранение прокрутки Наблюдение за клавишей предпочтений в SwiftUI

Сообщение Anonymous »

У меня есть SwiftUI ScrollView, для которого я хочу выполнять определенные действия при прокрутке и, в частности, при определении направления прокрутки.
Это моя настройка, чтобы выяснить направление прокрутки:

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

ScrollView {
content
.background(scrollDirectionTrackerView)
.onPreferenceChange(ScrollOffsetKey.self) { updatedOffset in
updateScrollDirection(updatedOffset)
}
}
.coordinateSpace(name: "scrollView")

private var scrollDirectionTrackerView: some View {
GeometryReader { proxy in
Color.clear.preference(key: ScrollOffsetKey.self,
value: -proxy.frame(in: .named(coordinateSpaceKey)).origin.y)
}
}
Если вы видите мой код, у меня вызывается функция updateScrollDirection, которая используется для определения направления прокрутки пользователя:

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

// Somewhere within the View
private let minimumDirectionChangeOffset = 16.0

private var scrollDirectionUpdateHandler: ((ScrollDirection) -> Void)?

@State private var currentDirection = ScrollDirection.none
@State private var previousScrollOffset = CGFloat.zero

private func updateScrollDirection(_ newOffset: CGFloat) {
let offsetDifference = previousScrollOffset - newOffset
var updatedDirection = currentDirection

if abs(offsetDifference) > minimumDirectionChangeOffset {
if offsetDifference > 0 {
updatedDirection = axis == .vertical ? .up : .backward
} else {
updatedDirection = axis == .vertical ? .down : .forward
}

previousScrollOffset = newOffset
}

// Only publish if we have a different direction
if updatedDirection != currentDirection {
currentDirection = updatedDirection
scrollDirectionUpdateHandler?(currentDirection) // The subscriber performs an animation
}
}
По большей части это работает хорошо. Я хочу обратить ваше внимание на последнюю строку, в которой я пишу анимацию, которая происходит только при изменении направления.
Если я выполняю быструю прокрутку в любом направлении, это работает хорошо.< /p>
Однако, когда я перетаскиваю очень медленно, я чувствую, что либо возникает состояние гонки с несколькими потоками, обращающимися к этой функции, либо что-то еще, но направление задается несколько раз, вызывая несколько анимаций, что приводит к работа пользователя нестабильна из-за анимации.
Мне интересно, есть ли более элегантный способ справиться с этим:
  • с помощью какого-то устранения дребезга
  • какой-то семафор/блокировка, позволяющая заблокировать функцию
  • или даже лучше математику?
Еще одна идея — это переменная Bool для блокировки функции, но я надеялся на что-то большее. элегантно.
Анимация, которую необходимо выполнить, — это скрытие/отображение представления на основе UIKit, поэтому анимация, которая происходит, представляет собой блок UIView.animate с длительностью 0,5.< /p>
Я попробовал этот старый ответ, но он мне не помог.
Есть ли лучший способ предотвратить многократное изменение направления прокрутки при медленном перетаскивании ?
Наконец, мне нужна поддержка iOS 16+.

Подробнее здесь: https://stackoverflow.com/questions/793 ... in-swiftui
Ответить

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

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

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

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

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