UIScrollView 在顶部显示行

UIScrollView is showing line on top

提问人:siflJebatkundy 提问时间:11/3/2023 最后编辑:siflJebatkundy 更新时间:11/3/2023 访问量:36

问:

我在 UIViewRepresentable 中使用 UIScrollView,并且我按块从数据库加载项目,每个块包含 15 个项目。

当我执行加载操作时,当用户滚动到滚动视图的顶部时,每个块都会加载,一切正常,直到我加载大约 3-5 个块(这意味着用户滚动到顶部 3-5 次)。当加载此数量或更多时,滚动视图的顶部会出现白色粗条,其行为就像我在顶部添加了一个白色矩形一样。

编辑:如果我一次加载所有数据,而不是按块加载,则滚动视图运行正常。

enter image description here

我使用此滚动视图:

    //--------------------------------------------------
// 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)
                    }
                }
            }
        }
    }
}

有人知道吗?

iOS SwiftUI UI查看 UIKIT

评论


答: 暂无答案