欢迎关注
最酷最in的云资讯

每个APP都用得上的SegmentedView Swift


image.png

腾讯新闻、今日头条、QQ音乐、网易云音乐、京东、爱奇艺、腾讯视频、淘宝、天猫、云微、微博等所有主流APP分类切换滚动视图

与其他的同类三方库对比的优点:

  • 指示器逻辑面向协议编程(Protocol Oriented Programming),可以为所欲为的扩展指示器效果;

  • 提供更加全面丰富效果,几乎支持所有主流APP效果;

  • 使用子类化管理cell样式,逻辑更清晰,扩展更简单;

Github地址

下载源码,一睹为快! JXSegmentedView

效果预览

指示器效果预览

说明 Gif
Line固定宽度
每个APP都用得上的SegmentedView Swift
Line与cell等宽
每个APP都用得上的SegmentedView Swift
Line延长
每个APP都用得上的SegmentedView Swift
Line延长+偏移
每个APP都用得上的SegmentedView Swift
RainbowLine彩虹
每个APP都用得上的SegmentedView Swift
DotLine点线
每个APP都用得上的SegmentedView Swift
DoubleLine双线
每个APP都用得上的SegmentedView Swift
Triangle三角形底部
每个APP都用得上的SegmentedView Swift
Triangle三角形顶部
每个APP都用得上的SegmentedView Swift
Background椭圆形
每个APP都用得上的SegmentedView Swift
Background椭圆形+阴影
每个APP都用得上的SegmentedView Swift
Background遮罩有背景
每个APP都用得上的SegmentedView Swift
Background遮罩无背景
每个APP都用得上的SegmentedView Swift
Background渐变色
(渐变是固定的)
每个APP都用得上的SegmentedView Swift
Gradient渐变色
(渐变随着位置变动)
每个APP都用得上的SegmentedView Swift
Image底部
每个APP都用得上的SegmentedView Swift
Image背景
每个APP都用得上的SegmentedView Swift
混合使用
每个APP都用得上的SegmentedView Swift

以下指示器支持上下位置切换:JXSegmentedIndicatorLineView、JXSegmentedIndicatorRainbowLineView、JXSegmentedIndicatorDotLineView、JXSegmentedIndicatorDoubleLineView、JXSegmentedIndicatorTriangleView、JXSegmentedIndicatorImageView

Cell样式效果预览

说明 Gif
颜色渐变
每个APP都用得上的SegmentedView Swift
文字渐变
每个APP都用得上的SegmentedView Swift
大小缩放
每个APP都用得上的SegmentedView Swift
大小缩放+字体粗细
每个APP都用得上的SegmentedView Swift
大小缩放+点击动画
每个APP都用得上的SegmentedView Swift
大小缩放+cell宽度缩放
每个APP都用得上的SegmentedView Swift
TitleImage_Top
每个APP都用得上的SegmentedView Swift
TitleImage_Left
每个APP都用得上的SegmentedView Swift
TitleImage_Bottom
每个APP都用得上的SegmentedView Swift
TitleImage_Right
每个APP都用得上的SegmentedView Swift
TitleImage_只有图片
每个APP都用得上的SegmentedView Swift
TitleOrImage(高仿腾讯视频)
每个APP都用得上的SegmentedView Swift
数字
每个APP都用得上的SegmentedView Swift
红点
每个APP都用得上的SegmentedView Swift
多行富文本
每个APP都用得上的SegmentedView Swift
多种cell混用
每个APP都用得上的SegmentedView Swift

特殊效果预览

说明 Gif
数据源过少
isItemSpacingAverageEnabled为true
每个APP都用得上的SegmentedView Swift
数据源过少
isItemSpacingAverageEnabled为false
每个APP都用得上的SegmentedView Swift
SegmentedControl
参考SegmentedControlViewController
每个APP都用得上的SegmentedView Swift
导航栏使用
参考NaviSegmentedControlViewController
每个APP都用得上的SegmentedView Swift
嵌套使用
参考NestViewController
每个APP都用得上的SegmentedView Swift
个人主页(上下左右滚动、header悬浮)
参考PagingViewController
更多样式请点击查看JXPagingView库
每个APP都用得上的SegmentedView Swift
数据加载&刷新
参考LoadDataViewController
每个APP都用得上的SegmentedView Swift

要求

  • iOS 8.0+

  • Xcode 9+

  • Swift 4.2

安装

手动

Clone代码,把Sources文件夹拖入项目,就可以使用了;

CocoaPods

target '' do    pod 'JXSegmentedView'end

先执行pod repo update,再执行pod install

使用

JXSegmentedView使用示例

1.初始化JXSegmentedView

self.segmentedView = JXSegmentedView()self.delegate = selfself.view.addSubview(self.segmentedView)

2.初始化dataSource

dataSouce类型为JXSegmentedViewDataSource协议。使用单独的类实现JXSegmentedViewDataSource协议,实现代码隔离。选择不同的类赋值给dataSource,就可以控制JXSegmentedView显示效果,实现插件化。比如选择JXSegmentedTitleImageDataSource类作为dataSource就选择了文字图片的显示效果;选择JXSegmentedNumberDataSource类作为dataSource就选择了文字加数字的显示效果;

//segmentedDataSource一定要通过属性强持有,不然会被释放掉

self.segmentedDataSource = JXSegmentedTitleDataSource()//配置数据源相关配置属性self.segmentedDataSource.titles = ["猴哥", "青蛙王子", "旺财"]self.segmentedDataSource.isTitleColorGradientEnabled = true//reloadData(selectedIndex:)方法一定要调用,方法内部会刷新数据源数组self.segmentedDataSource.reloadData(selectedIndex: 0)//关联dataSourceself.segmentedView.dataSource = self.segmentedDataSource

3.初始化指示器indicator

let indicator = JXSegmentedIndicatorLineView()indicator.indicatorWidth = 20self.segmentedView.indicators = [indicator]

4.实现JXSegmentedViewDelegate代理

//点击选中或者滚动选中都会调用该方法。适用于只关心选中事件,而不关心具体是点击还是滚动选中的情况。func segmentedView(_ segmentedView: JXSegmentedView, didSelectedItemAt index: Int) {}// 点击选中的情况才会调用该方法func segmentedView(_ segmentedView: JXSegmentedView, didClickSelectedItemAt index: Int) {}// 滚动选中的情况才会调用该方法func segmentedView(_ segmentedView: JXSegmentedView, didScrollSelectedItemAt index: Int) {}// 正在滚动中的回调func segmentedView(_ segmentedView: JXSegmentedView, scrollingFrom leftIndex: Int, to rightIndex: Int, percent: CGFloat) {}

contentScrollView列表容器使用示例

直接使用UIScrollView自定义使用示例

因为代码比较分散,而且代码量也比较多,所有不推荐使用该方法。要正确使用需要注意的地方比较多,尤其对于刚接触iOS的同学来说不太友好。

不直接贴代码了,具体点击LoadDataCustomViewController查看源代码了解。

作为替代,官方使用&强烈推荐使用下面这种方式。

配合JXSegmentedListContainerView封装类使用示例

JXSegmentedListContainerView是对列表视图高度封装的类,具有以下优点:

  • 相对于直接使用UIScrollView自定义,封装度高、代码集中、使用简单;

  • 列表懒加载:当显示某个列表的时候,才进行列表初始化。而不是一次性加载全部列表,性能更优;

1.初始化JXSegmentedListContainerView

self.listContainerView = JXSegmentedListContainerView(dataSource: self)self.view.addSubview(self.listContainerView)//关联cotentScrollView,关联之后才可以互相联动!!!self.segmentedView.contentScrollView = self.listContainerView.scrollView

2.实现JXSegmentedListContainerViewDataSource代理方法

//返回列表的数量func numberOfLists(in listContainerView: JXSegmentedListContainerView) -> Int {    return self.segmentedDataSource.titles.count}//返回遵从`JXSegmentedListContainerViewListDelegate`协议的实例func listContainerView(_ listContainerView: JXSegmentedListContainerView, initListAt index: Int) -> JXSegmentedListContainerViewListDelegate {    return ListBaseViewController()}

3.列表实现JXSegmentedListContainerViewListDelegate代理方法

不管列表是UIView还是UIViewController都可以,提高使用灵活性,更便于现有的业务接入。

/// 如果列表是VC,就返回VC.view/// 如果列表是View,就返回View自己/// - Returns: 返回列表视图func listView() -> UIView {    return view}//可选使用,列表显示的时候调用func listDidAppear() {}//可选使用,列表消失的时候调用func listDidDisappear() {}

4.将关键事件告知JXSegmentedListContainerView

在下面两个JXSegmentedViewDelegate代理方法里面调用对应的代码,一定不要忘记这一条❗️❗️❗️

func segmentedView(_ segmentedView: JXSegmentedView, didClickSelectedItemAt index: Int) {    //传递didClickSelectedItemAt事件给listContainerView,必须调用!!!    listContainerView.didClickSelectedItem(at: index)}func segmentedView(_ segmentedView: JXSegmentedView, scrollingFrom leftIndex: Int, to rightIndex: Int, percent: CGFloat) {    //传递scrolling事件给listContainerView,必须调用!!!    listContainerView.segmentedViewScrolling(from: leftIndex, to: rightIndex, percent: percent, selectedIndex: segmentedView.selectedIndex)}

具体点击LoadDataViewController查看源代码了解

使用总结

因为JXSegmentedView本身支持许多特性:指示器、cell样式、列表容器等,如何有序管理好代码成了一个难题。借助于协议、继承、封装类极大的简化了使用难度,而且提高了灵活性,扩展相当容易。

  • 核心主类:JXSegmentedView

  • 数据源&cell样式定制类:遵从JXSegmentedViewDataSource协议的类

  • 指示器类:遵从JXSegmentedIndicatorProtocol协议的UIView

  • 列表容器:官方推荐JXSegmentedListContainerView类,特殊情况可以使用UIScrollView自定义

指示器样式自定义

  • 需要继承JXSegmentedIndicatorProtocol协议,点击参看JXSegmentedIndicatorProtocol

  • 提供了继承JXSegmentedIndicatorProtocol协议的基类JXSegmentedIndicatorBaseView,里面提供了许多基础属性。点击参看JXSegmentedIndicatorBaseView

  • 自定义指示器,请参考已实现的指示器视图,多尝试、多思考,再有问题请提Issue或加入反馈QQ群

dataSource和Cell自定义

  • 需要继承JXSegmentedViewDataSource协议,点击参看JXSegmentedViewDataSource

  • 提供了继承JXSegmentedViewDataSource协议的基类JXSegmentedBaseDataSource,里面提供了许多基础属性。点击参看JXSegmentedBaseDataSource

  • 任何自定义需求,dataSource、cell、itemModel三个都要子类化。即使某个子类cell什么事情都不做。用于维护继承链,以免以后子类化都不知道要继承谁了;

  • dataSource和Cell自定义,请参考已实现的dataSource,多尝试、多思考,再有问题请提Issue或加入反馈QQ群

常用属性说明

常用属性说明文档地址

其他使用注意事项

其他使用注意事项文档地址

作者:兰鑫
链接:https://juejin.im/post/5c6379e451882562a12acb91

赞(0) 打赏
未经允许不得转载:云微资讯 » 每个APP都用得上的SegmentedView Swift
分享到: 更多 (0)

云微资讯 科技新媒体资讯平台

关于我们联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏