pujiaxin33 / JXSegmentedView

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

listWillAppear、listDidAppear、listWillDisappear、listDidDisappear代理函数回调错乱 #204

Closed zealfung closed 2 months ago

zealfung commented 2 years ago

JXSegmentedListContainerView类型为scrollView 列表是两个VC,左右滑动切换列表时(多滑动切换两次很容易重现),两个VC分别的listWillAppear、listDidAppear、listWillDisappear、listDidDisappear代理函数回调错乱,并且最终调用的listDidAppear不是正在显示的那个VC的

DNC-7 commented 2 years ago

segmentedListContainerView line 431 的判断改成 guard scrollView.isTracking || scrollView.isDragging || scrollView.isDecelerating 试试

wrxdz commented 2 years ago

正常,一些小瑕疵,JXPagingListContainerView 也有这个问题 彻底停止滚动调用 multiScrollViewDidEndScroll(),自己修改下就行

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    if !decelerate {
        multiScrollViewDidEndScroll()
    }
}

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    multiScrollViewDidEndScroll()
}

func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
    multiScrollViewDidEndScroll()
}

private func multiScrollViewDidEndScroll() {
    // 关键多执行这一行
    listDidAppearOrDisappear(scrollView: scrollView)

    //滑动到一半又取消滑动处理
    if willAppearIndex != -1 || willDisappearIndex != -1 {
        listWillDisappear(at: willAppearIndex)
        listWillAppear(at: willDisappearIndex)
        listDidDisappear(at: willAppearIndex)
        listDidAppear(at: willDisappearIndex)
        willDisappearIndex = -1
        willAppearIndex = -1
    }

}
pujiaxin33 commented 2 months ago

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