提问人:siflJebatkundy 提问时间:11/3/2023 最后编辑:siflJebatkundy 更新时间:11/3/2023 访问量:36
UIScrollView 在顶部显示行
UIScrollView is showing line on top
问:
我在 UIViewRepresentable 中使用 UIScrollView,并且我按块从数据库加载项目,每个块包含 15 个项目。
当我执行加载操作时,当用户滚动到滚动视图的顶部时,每个块都会加载,一切正常,直到我加载大约 3-5 个块(这意味着用户滚动到顶部 3-5 次)。当加载此数量或更多时,滚动视图的顶部会出现白色粗条,其行为就像我在顶部添加了一个白色矩形一样。
编辑:如果我一次加载所有数据,而不是按块加载,则滚动视图运行正常。
我使用此滚动视图:
//--------------------------------------------------
// EXTENDED SCROLL VIEW
//--------------------------------------------------
struct ExtendedScrollView<Content: View>: UIViewRepresentable {
//--------------------------------------------------
// VARIABLES
//--------------------------------------------------
var content: () -> Content
var ScrolledToTop: () -> Void
@Binding var messageAreaY: CGFloat
@Binding var messageAreaIsFocused: Bool
//--------------------------------------------------
// METHODS
//--------------------------------------------------
// MAKE UIVIEW
func makeUIView(context: Context) -> UIScrollView {
let scrollView = UIScrollView()
scrollView.delegate = context.coordinator
scrollView.isScrollEnabled = true
scrollView.showsVerticalScrollIndicator = true
scrollView.showsHorizontalScrollIndicator = false
scrollView.bounces = true
return scrollView
}
//--------------------------------------------------
// UPDATE UIVIEW
func updateUIView(_ uiView: UIScrollView, context: Context) {
for subview in uiView.subviews {
subview.removeFromSuperview()
}
let hostView = UIHostingController(rootView: content())
hostView.view.translatesAutoresizingMaskIntoConstraints = false
uiView.addSubview(hostView.view)
NSLayoutConstraint.activate([
hostView.view.topAnchor.constraint(equalTo: uiView.topAnchor),
hostView.view.bottomAnchor.constraint(equalTo: uiView.bottomAnchor),
hostView.view.leadingAnchor.constraint(equalTo: uiView.leadingAnchor),
hostView.view.trailingAnchor.constraint(equalTo: uiView.trailingAnchor)
])
}
//--------------------------------------------------
// MAKE COORDINATOR
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
//--------------------------------------------------
// COORDINATOR
//--------------------------------------------------
class Coordinator: NSObject, UIScrollViewDelegate, UIGestureRecognizerDelegate {
var parent: ExtendedScrollView
var startSwipePos: CGFloat = 0
var currentSwipePos: CGFloat = 0
//--------------------------------------------------
// CONSTRUCTOR
init(_ parent: ExtendedScrollView) {
self.parent = parent
}
//--------------------------------------------------
// SCROLL VIEW DID SCROLL
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let offsetY = scrollView.contentOffset.y
let contentHeight = scrollView.contentSize.height
let scrollViewHeight = scrollView.frame.size.height
// IF USER REACHED BOTTOM
if offsetY + scrollViewHeight >= contentHeight {
parent.ScrolledToTop()
}
// HANDLE DRAG GESTURE
if scrollView.panGestureRecognizer.state == .began { // if gesture began
startSwipePos = scrollView.panGestureRecognizer.location(in: UIApplication.shared.windows.first).y // set start position
}
if scrollView.panGestureRecognizer.state == .changed { // if gesture proceeds
currentSwipePos = scrollView.panGestureRecognizer.location(in: UIApplication.shared.windows.first).y // update current position
if currentSwipePos > parent.messageAreaY && startSwipePos < parent.messageAreaY && parent.messageAreaIsFocused {
DispatchQueue.main.async {
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
}
}
}
}
}
}
有人知道吗?
答: 暂无答案
评论