类似微博主页、简书主页、QQ联系人页面等效果。多页面嵌套,既可以上下滑动,也可以左右滑动切换页面。支持HeaderView悬浮、支持下拉刷新、上拉加载更多。
与其他同类三方库对比有何优点:
- 手势交互更自然;
- 悬浮的categoryView支持更多效果,而且支持自定义扩展;
- 封装性更好,不用关心内部实现,只需要实现对应delegate方法即可;
- 支持像使用普通UITableView一样,添加下拉刷新、上拉加载更多功能;
头图缩放原理,有不明白的可以参考我写的:JXTableViewZoomHeaderImageView 一看就懂了。
悬浮的HeaderView,用的是我写的:JXCategoryView 几乎实现了所有主流效果,而且非常容易自定义扩展,强烈推荐阅读。
1.实例化JXPagingView
pagingView = JXPagingView(delegate: self)
pagingView.delegate = self
self.view.addSubview(pagingView)
2.实现JXPagingViewDelegate
@objc public protocol JXPagingViewDelegate: NSObjectProtocol {
/// tableHeaderView的高度
///
/// - Parameter pagingView: JXPagingViewView
/// - Returns: height
func tableHeaderViewHeight(in pagingView: JXPagingView) -> CGFloat
/// 返回tableHeaderView
///
/// - Parameter pagingView: JXPagingViewView
/// - Returns: view
func tableHeaderView(in pagingView: JXPagingView) -> UIView
/// 返回悬浮HeaderView的高度。
///
/// - Parameter pagingView: JXPagingViewView
/// - Returns: height
func heightForHeaderInSection(in pagingView: JXPagingView) -> CGFloat
/// 返回悬浮HeaderView。我用的是自己封装的JXCategoryView(Github:https://github.com/pujiaxin33/JXCategoryView),你也可以选择其他的三方库或者自己写
///
/// - Parameter pagingView: JXPagingViewView
/// - Returns: view
func viewForHeaderInSection(in pagingView: JXPagingView) -> UIView
/// 底部listView的条数
///
/// - Parameter pagingView: JXPagingViewView
/// - Returns: count
func numberOfListViews(in pagingView: JXPagingView) -> Int
/// 返回对应index的listView,需要是UIView的子类,且要遵循JXPagingViewListViewDelegate。
/// 这里要求返回一个UIView而不是一个UIScrollView,因为listView可能并不只是一个单纯的UITableView或UICollectionView,可能还会有其他的子视图。
///
/// - Parameters:
/// - pagingView: JXPagingViewView
/// - row: row
/// - Returns: view
func pagingView(_ pagingView: JXPagingView, listViewInRow row: Int) -> JXPagingViewListViewDelegate & UIView
/// mainTableView的滚动回调,用于实现头图跟随缩放
///
/// - Parameter scrollView: JXPagingViewMainTableView
@objc optional func mainTableViewDidScroll(_ scrollView: UIScrollView)
}
3.让外部listView遵从JXPagingViewListViewDelegate
协议
//该协议主要用于mainTableView已经显示了header,listView的contentOffset需要重置时,内部需要访问到外部传入进来的listView内的scrollView
@objc public protocol JXPagingViewListViewDelegate: NSObjectProtocol {
var scrollView: UIScrollView { get }
}
4.将外部listView的滚动事件传入View
func listViewDidScroll(_ scrollView: UIScrollView) {
pagingView.listViewDidScroll(scrollView: scrollView)
}
有不明白的地方,建议多看下源码。再有疑问的,欢迎提Issue交流🤝