pujiaxin33 / JXSegmentedView

A powerful and easy to use segmented view (segmentedcontrol, pagingview, pagerview, pagecontrol, categoryview) (腾讯新闻、今日头条、QQ音乐、网易云音乐、京东、爱奇艺、腾讯视频、淘宝、天猫、简书、微博等所有主流APP分类切换滚动视图)
MIT License
2.66k stars 369 forks source link

手指慢慢拖动切换 listDidAppear不会执行 #213

Closed zhangtong99 closed 1 week ago

thomashooo commented 1 year ago

我被这个坑了几天了,不知道是不是类似问题,主要就是滑动切换,没有进行 去更新JXPagingListContainerView.swift中,didClickSelectedItem操作(点击和代码切换都有):

public func didClickSelectedItem(at index: Int) {
    guard checkIndexValid(index) else {
        return
    }
    willAppearIndex = -1
    willDisappearIndex = -1
    if currentIndex != index {
        listWillDisappear(at: currentIndex)
        listWillAppear(at: index)
        listDidDisappear(at: currentIndex)
        listDidAppear(at: index)
    }
}

问题代码:

JXSegmentedView.swift中: if index == selectedIndex { if selectedType == .code { listContainer?.didClickSelectedItem(at: index) }else if selectedType == .click { delegate?.segmentedView(self, didClickSelectedItemAt: index) listContainer?.didClickSelectedItem(at: index) }else if selectedType == .scroll { delegate?.segmentedView(self, didScrollSelectedItemAt: index) //这里拖动缺少:listContainer?.didClickSelectedItem的操作,为什么呢?我是加上就好了。不改源码的话,可以在上面方法外调用一下:listContainer?.didClickSelectedItem //我的场景是每次会更新listContainer的高度,因为底部内容过少主Cell就不必要那么高垂直滚动。 } delegate?.segmentedView(self, didSelectedItemAt: index) scrollingTargetIndex = -1 return }

可以外部实现delegate修一下: func segmentedView(_ segmentedView: JXSegmentedView, didScrollSelectedItemAt index: Int) { //修正滑动切换,内部不更新listContainer内索引?导致混乱 segmentedView.listContainer?.didClickSelectedItem(at: index) }

thomashooo commented 1 year ago

持续研究了一下,最终导致问题的是 scrollViewDidScroll中调用listDidAppearOrDisappear方法无法触发为,下一页。落到scrollViewDidEndDecelerating去执行了取消滑动了。。。

thomashooo commented 1 year ago

参考这个解决:https://github.com/pujiaxin33/JXSegmentedView/issues/204 添加:scrollView.isDecelerating 状态检测。

pujiaxin33 commented 1 week ago

已修复,via https://github.com/pujiaxin33/JXSegmentedView/pull/201