想了解更丰富的个人主页效果或有疑问,请点击参看JXPagingView库
JXSegmentedListContainerType.scrollView
表示内部创建了UIScrollView
来当做列表视图的容器,所有的列表返回的listView
会被addSubview到UIScrollView
。
JXSegmentedListContainerType.collectionView
表示内部创建了UICollectionView
来当做列表视图的容器,所有的列表返回的listView
会被addSubview到UICollectionView
的UICollectionVeiwCell
上面。
- 优势:因为列表视图被添加到
UICollectionVeiwCell
上面,所以受到cell重用机制的影响,未显示的列表不会出现在视图层级里面。视图的内存占用会相对小一些。 - 劣势:真是因为
UICollectionVeiwCell
的重用机制,会有一些副作用,下面是已知的一个问题:
//因为`JXSegmentedListContainerView`内部通过`UICollectionView`的cell加载列表。当切换tab的时候,之前的列表所在的cell就被回收到缓存池,就会从视图层级树里面被剔除掉,即没有显示出来且不在视图层级里面。这个时候MJRefreshHeader所持有的UIActivityIndicatorView就会被设置hidden。所以需要在列表显示的时候,且isRefreshing==YES的时候,再让UIActivityIndicatorView重新开启动画。
if refreshControl?.isRefreshing == true {
refreshControl?.beginRefreshing()
}
- 优势:没有副作用
- 劣势:视图内存占用对多一点。
基于此:默认推荐使用JXSegmentedListContainerType.scrollView
。如果你的列表视图都比较复杂,内存占用比较大的情况,才推荐使用JXSegmentedListContainerType.collectionView
。具体的内存对比,你可以自己针对相同的页面对比使用,查看XCode的内存使用统计就可以知道了。
因为列表容器可以左右滑动,如果要开启左滑删除,这个时候系统会响应列表容器的左右滑动,而不是列表cell的左滑删除。所以,建议的方案是禁止列表容器滑动,这样就可以响应列表的左滑删除了。 列表容器滑动禁止,使用下面的代码:
listContainerView.scrollView.scrollEnabled = NO;
初始化过后,有新的数据源、属性配置有变动时(比如从服务器拉取回来数据,重新赋值titles),需要调用reloadData
方法刷新状态。
reloadDataWithoutListContainer
与reloadData
相比,只是reloadDataWithoutListContainer
方法内部没有调用listContainer,reloadData()
方法。用于只是想刷新JXSegmentedView
的UI的情况,比如刷新cell上的数字、红点等,而不需要刷新列表容器。
JXSegmentedView没有与contentScrollView或listContainer强关联,你甚至可以不设置这个属性,把它当做简单的SegmentedControl。他们之间布局没有任何要求,可以把JXSegmentedView放入导航栏、UITableViewSectionHeader等任何你想要的地方。
通过isContentScrollViewClickTransitionAnimationEnabled
属性控制。点击切换item时:设置为true,contentScrollView会进行滚动切换。设置为false,contentScrollView的切换没有滚动动画。
当业务需要某个时刻要跳转到指定index,比如当前index=0,用户点击了某个按钮,需要立即跳转到index=3的位置,使用下列代码即可:
segmentedView.selectItemAt(index: 3)
如果列表是自定义的View,请参考Demo的使用方法,是给列表添加一个自定义属性:weak var naviController: UINavigationController?
,然后把父VC的navigationController赋值给它。这样列表内部就可以通过自定义属性naviController
进行cell的点击跳转了。
如果列表是UIViewController,直接使用navigationController即可。
参考如下代码:
isListHorizontalScrollEnabled = false
高度取整代码:
open override func layoutSubviews() {
super.layoutSubviews()
collectionView.frame = CGRect(x: 0, y: 0, width: bounds.size.width, height: floor(bounds.size.height))
}
部分使用者为了适配不同的手机屏幕尺寸,JXSegmentedView的宽高比要求保持一样。所以它的高度就会因为不同宽度的屏幕而不一样。计算出来的高度,有时候会是位数很长的浮点数,如果把这个高度设置给UICollectionView就会触发内部的一个错误。所以,为了规避这个问题,在这里对高度统一向下取整。 如果向下取整导致了你的页面异常,请自己重新设置JXSegmentedView的高度,保证为整数即可。
因为JXSegmentedView内部使用了UICollectionView,在某些系统会对内部的UICollectionView进行错误的调整。所以,内部会自己找到父VC,然后将其automaticallyAdjustsScrollViewInsets属性设置为false。
open override func willMove(toSuperview newSuperview: UIView?) {
super.willMove(toSuperview: newSuperview)
var nextResponder: UIResponder? = newSuperview
while nextResponder != nil {
if let parentVC = nextResponder as? UIViewController {
parentVC.automaticallyAdjustsScrollViewInsets = false
break
}
nextResponder = nextResponder?.next
}
}
调用func reloadItem(at index: Int)
方法刷新指定index。
某些情况需要刷新某一个cell的UI显示,比如红点示例里面。
JXSegmentedView
即使提供了灵活扩展,也不可能满足所有情况。未能满足特殊需求的情况,建议通过fork仓库,实现特殊效果。