如何解决在SwiftUI中释放拖动时ScrollView跳跃
我正在使用Introspect进行拉动以刷新ScrollView。
当我下拉刷新时,滚动视图会跳回。
我知道这是一个已经解决的常见问题,但是使用SwiftUI和Introspect,我不知道将手指放在哪里。
我知道可以使用scrollDidEndDragging进行修复,但是我不能在这里实现。
有人知道如何用给定的代码解决此问题吗?
代码:
private struct PullToRefresh: UIViewRepresentable {
@Binding var isShowing: Bool
let onRefresh: () -> Void
public init(isShowing: Binding<Bool>,onRefresh: @escaping () -> Void) {
_isShowing = isShowing
self.onRefresh = onRefresh
}
public class Coordinator {
let onRefresh: () -> Void
let isShowing: Binding<Bool>
init(onRefresh: @escaping () -> Void,isShowing: Binding<Bool>) {
self.onRefresh = onRefresh
self.isShowing = isShowing
}
@objc func onValueChanged() {
isShowing.wrappedValue = true
onRefresh()
}
}
public func makeUIView(context: UIViewRepresentableContext<PullToRefresh>) -> UIView {
let view = UIView(frame: .zero)
view.isHidden = true
view.isUserInteractionEnabled = false
return view
}
private func scrollView(entry: UIView) -> UIScrollView? {
if let scrollView = Introspect.findAncestor(ofType: UIScrollView.self,from: entry) {
return scrollView
}
guard let viewHost = Introspect.findViewHost(from: entry) else {
return nil
}
return Introspect.previousSibling(containing: UIScrollView.self,from: viewHost)
}
public func updateUIView(_ uiView: UIView,context: UIViewRepresentableContext<PullToRefresh>) {
DispatchQueue.main.asyncAfter(deadline: .now()) {
guard let scrollView = self.scrollView(entry: uiView) else {
return
}
if let refreshControl = scrollView.refreshControl {
if self.isShowing {
refreshControl.beginRefreshing()
} else {
refreshControl.endRefreshing()
}
return
}
let refreshControl = UIRefreshControl()
refreshControl.addTarget(context.coordinator,action: #selector(Coordinator.onValueChanged),for: .valueChanged)
scrollView.refreshControl = refreshControl
}
}
public func makeCoordinator() -> Coordinator {
return Coordinator(onRefresh: onRefresh,isShowing: $isShowing)
}
}
用法:
extension View {
public func pullToRefresh(isShowing: Binding<Bool>,onRefresh: @escaping () -> Void) -> some View {
return overlay(
PullToRefresh(isShowing: isShowing,onRefresh: onRefresh)
.frame(width: 0,height: 0),alignment: .center)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。