Skip to content

Latest commit

 

History

History
116 lines (79 loc) · 6.54 KB

注意事项.md

File metadata and controls

116 lines (79 loc) · 6.54 KB

个人主页效果

想了解更丰富的个人主页效果或有疑问,请点击参看JXPagingView库

侧滑手势处理

侧滑手势处理文档地址

列表的生命周期方法处理

列表的生命周期方法处理

JXSegmentedListContainerTypescrollViewcollectionView对比

JXSegmentedListContainerType.scrollView表示内部创建了UIScrollView来当做列表视图的容器,所有的列表返回的listView会被addSubview到UIScrollView

JXSegmentedListContainerType.collectionView表示内部创建了UICollectionView来当做列表视图的容器,所有的列表返回的listView会被addSubview到UICollectionViewUICollectionVeiwCell上面。

JXSegmentedListContainerType.collectionView

  • 优势:因为列表视图被添加到UICollectionVeiwCell上面,所以受到cell重用机制的影响,未显示的列表不会出现在视图层级里面。视图的内存占用会相对小一些。
  • 劣势:真是因为UICollectionVeiwCell的重用机制,会有一些副作用,下面是已知的一个问题:
//因为`JXSegmentedListContainerView`内部通过`UICollectionView`的cell加载列表。当切换tab的时候,之前的列表所在的cell就被回收到缓存池,就会从视图层级树里面被剔除掉,即没有显示出来且不在视图层级里面。这个时候MJRefreshHeader所持有的UIActivityIndicatorView就会被设置hidden。所以需要在列表显示的时候,且isRefreshing==YES的时候,再让UIActivityIndicatorView重新开启动画。
if refreshControl?.isRefreshing == true {
    refreshControl?.beginRefreshing()
}

JXSegmentedListContainerType.scrollView

  • 优势:没有副作用
  • 劣势:视图内存占用对多一点。

基于此:默认推荐使用JXSegmentedListContainerType.scrollView。如果你的列表视图都比较复杂,内存占用比较大的情况,才推荐使用JXSegmentedListContainerType.collectionView。具体的内存对比,你可以自己针对相同的页面对比使用,查看XCode的内存使用统计就可以知道了。

cell左滑删除

因为列表容器可以左右滑动,如果要开启左滑删除,这个时候系统会响应列表容器的左右滑动,而不是列表cell的左滑删除。所以,建议的方案是禁止列表容器滑动,这样就可以响应列表的左滑删除了。 列表容器滑动禁止,使用下面的代码:

listContainerView.scrollView.scrollEnabled = NO;

JXSegmentedView状态刷新

初始化过后,有新的数据源、属性配置有变动时(比如从服务器拉取回来数据,重新赋值titles),需要调用reloadData方法刷新状态。

reloadDataWithoutListContainer方法使用说明

reloadDataWithoutListContainerreloadData相比,只是reloadDataWithoutListContainer方法内部没有调用listContainer,reloadData()方法。用于只是想刷新JXSegmentedView的UI的情况,比如刷新cell上的数字、红点等,而不需要刷新列表容器。

listContainer或contentScrollView关联说明

JXSegmentedView没有与contentScrollView或listContainer强关联,你甚至可以不设置这个属性,把它当做简单的SegmentedControl。他们之间布局没有任何要求,可以把JXSegmentedView放入导航栏、UITableViewSectionHeader等任何你想要的地方。

点击Item之后contentScrollView切换效果

通过isContentScrollViewClickTransitionAnimationEnabled属性控制。点击切换item时:设置为true,contentScrollView会进行滚动切换。设置为false,contentScrollView的切换没有滚动动画。

代码选中指定index

当业务需要某个时刻要跳转到指定index,比如当前index=0,用户点击了某个按钮,需要立即跳转到index=3的位置,使用下列代码即可:

segmentedView.selectItemAt(index: 3)

列表cell点击跳转示例

如果列表是自定义的View,请参考Demo的使用方法,是给列表添加一个自定义属性:weak var naviController: UINavigationController?,然后把父VC的navigationController赋值给它。这样列表内部就可以通过自定义属性naviController进行cell的点击跳转了。

如果列表是UIViewController,直接使用navigationController即可。

禁止列表容器左右滑动

参考如下代码:

isListHorizontalScrollEnabled = false

JXSegmentedView.collectionView高度取整说明

高度取整代码:

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的高度,保证为整数即可。

对父VC的automaticallyAdjustsScrollViewInsets属性设置为false

因为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
    }
}

单个cell刷新

调用func reloadItem(at index: Int)方法刷新指定index。 某些情况需要刷新某一个cell的UI显示,比如红点示例里面。

自定义建议

JXSegmentedView即使提供了灵活扩展,也不可能满足所有情况。未能满足特殊需求的情况,建议通过fork仓库,实现特殊效果。