Swift 今日头条,网易,腾信标题滚动视图

STSegmentPageView

Github

Introduce

高效易用的标题滚动视图,Written in Swift. (仿 美团,今日头条,网易,淘宝标题滚动视图).


1.png
2.png

Requirements

Installation

STSegmentPageView 可以通过 CocoaPods 安装. 请添加下列到你的 Podfile:

pod 'STSegmentPageView'

手动安装

下载项目,然后把“STSegmentPageView”文件夹拖拽入你的项目中

Usage

使用 集成好的STSegmentPageViewController:

// use default title view configure
let config = STSegmentPageTitleViewConfigure()
let titles = ["推荐","热点","视频","娱乐","问答","北京","朝阳","地方","八卦","综艺","推荐","热点","视频","娱乐","问答","北京","朝阳","地方","八卦","综艺"]
var models = titles.map { (title) -> STSegmentModel in
 let model = STSegmentModel()
 let controller = SecondViewController()
 controller.label.text = title
 model.segmentTitle = title
 model.segmentController = controller
 return model
}
//使用自定义高度
let segmentVC = STSegmentPageViewController(childrenModels: models, titleViewH: 40, titleConfig: config)
segmentVC.view.frame = CGRect(x: 0, y: 64, width: view.width, height: view.height - 64 )
​
segmentVC.addSegmentController(toParentController: self)

使用自定义 title view and content view 来实现功能, 切记需要联动的话开发者一定要实现 STSegmentContentViewDelegate, STSegmentTitleViewDelegate, 这样才可以把 title view 和 content view 关联到一起.

let titles = ["推荐","热点","视频","娱乐","问答","北京","朝阳","地方","八卦","综艺","推荐","热点","视频","娱乐","问答","北京","朝阳","地方","八卦","综艺"]
let config = STSegmentPageTitleViewConfigure()
// title view
pageTitleView = STSegmentTitleView(config:config ,titles: titles)
pageTitleView!.frame = CGRect(x: 0, y: 64, width: view.width, height: 48)
view.addSubview(pageTitleView!)
pageTitleView?.delegate = self
​
// content view
var vcs = [UIViewController]()
for (i,_) in titles.enumerated(){
 let controller = SecondViewController()
 controller.label.text = "\(i)"
 vcs.append(controller)
}
​
pageView = STSegmentContentView(frame: CGRect(x: 0, y: (pageTitleView?.frame.maxY ?? 0), width: view.width, height: view.height - (pageTitleView?.frame.maxY  ?? 0) ), childrenControllers: vcs, parentVC:self)
pageView?.delegate = self
view.addSubview(pageView!)
​
​
​
///// Delegate
extension ViewController : STSegmentTitleViewDelegate{
 func didSelectedSegmentTitleViewItemAt(atIndex index: Int) {
 pageView?.didSelectedItemAtIndex(atIndex: index)
 }
}
extension ViewController : STSegmentContentViewDelegate{
 func pageContentViewDidScrollToItem(atIndex targetIndex: Int) {
 pageTitleView?.didSelectedTitleItemAtIndex(atIndex: targetIndex)
 }
 func pageContentViewDidScroll(progress: CGFloat, originIndex: Int, targetIndex: Int) {
 pageTitleView?.updateTitleViewWhenContentViewDrag(progress: progress, fromIndex:         originIndex, endIndex: targetIndex)
 }
}

自定义标题配置

 // MARK: - 指示器
 /// 指示器style,默认为下划线
 public var indicatorStyle : STSegmentTitleViewIndicatorStyle = .default

 /// 指示器滚动样式,默认随着内容视图滚动而动
 public var indicatorScrollStyle : STSegmentTitleViewIndicatorScrollStyle = .default

 /// 指示器颜色,默认红色
 public var indicatorColor : UIColor = .red

 /// - 指示器高度
 /// - 下划线样式下,固定长度样式,默认高度是2.f
 /// - 遮罩样式下,默认高度和标题文本高度一致,如若大于标题视图高度,则为标题视图高度,取值范围:标题高度~标题视图高度
 /// - 其他情况不做处理
 public var indicatorHeight : CGFloat = 2.0

 /// 指示器圆角值,默认0.1
 public var indicatorCornerRadius : CGFloat = 0.1

 /// - 指示器宽度,只在style类型为fixed情况下有效,默认值20.0
 /// - 在fixed样式下,宽度只会和文本长度一直
 public var indicatorWidthWhenFixedStyle : CGFloat = 20.0

 /// 指示器动画时间,取值范围 0.1 ~ 0.4, 超出取边界值
 public var indicatorAnimationTime : Double = 0.1

 //MARK: - 底部底线 默认值Hex-color #eaeaea RGB(234,234,234)
 public var bottomSeparatorColor : UIColor = UIColor(red: 234/255.0, green: 234/255.0, blue: 234/255.0, alpha: 1.0)

 /// 底线高度,默认值0.5
 public var bottonSeparatorHeight : CGFloat = 0.5

 /// 底线样式,默认有底线
 public var bottomSeparatorStyle : STSegmentTitleViewBottomSeparatorStyle = .default

 //MARK: - 标题设置

 /// 标题字体,默认系统15号字体
 public var titleFont : UIFont = UIFont.systemFont(ofSize: 15)

 /// 标题未选状态颜色,默认黑色
 public var titleNormalColor : UIColor = .black

 /// - 标题选中状态颜色,默认红色
 /// - 遮罩模式,需要把指示器和字体颜色设为不一致,不然标题会看不到
 public var titleSelectedColor : UIColor = .red

 /// 标题之间的间隔,默认值15
 public var spaceBetweenTitles : CGFloat = 15.0

 /// 第一个标题左侧之间的间隔,默认值20
 public var spaceBetweenFirstTitleAndLeftSide : CGFloat = 20

 /// - 选中标题之后是否缩放,默认true
 /// - true的情况下,设置缩放系数deltaScaleIndex才生效
 /// - 指示器在default,shade样式下默认随着一起缩放; fixed不会
 public var wouldScaledWhenSelected : Bool = true

 /// - 缩放系数,默认0.1
 /// - 取值范围 -0.1 ~ 0.1, 负数缩小,0不缩放,正数放大
 /// scaleXY = 1 + deltaScaleIndex
 public var deltaScaleIndex : CGFloat = 0.1

 //MARK: - 内容视图
 /// 标题移动渐变效果,默认true
 public var shouldTitleGradientEffect : Bool = true

 /// 弹性效果,默认true
 public var shouldBounces : Bool = true

 /// 标题视图背景颜色,默认是白色alpha为0.7
 public var titleViewBackgroundColor : UIColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 0.7)

 //MARK: - 右侧按钮

 /// - 使用右侧按钮,默认是false不使用。
 /// - true的情况下,需要设置rightButton才会显示该按钮
 public var wouldUseRightButton : Bool = false

 /// - 右侧按钮,如为nil,则相当于wouldUseRightButton = false
 /// - 点击事件可以执行按钮点击事件Block "didClickRightButtonAt",也可以外部直接addTarget
 /// - 按钮在标题视图中的宽高,为外部设置的宽高。如果高度超出了标题视图,按照实际设置的宽高比例缩放
 /// - 外部用户需要设计好自己的按钮样式:
 ///   - 包括字体属性,以及按钮宽高,否认按钮的默认宽高将是标题视图高
 public var rightButton : UIButton?

 /// 右侧按钮的左侧效果,默认有效果,前提是设置了右侧按钮
 public var showRightButtonSeparator : Bool = true

 /// 右侧按钮点击事件
 public var didClickRightButtonAt : (() -> Void)?

Author

EricWan, hongenwan@gmail.com

Concluding remarks

如果使用过程中遇到问题,请及时 Issue 或者 hongenwan@gmail.com, 看到了我会及时回复,谢谢

License

STSegmentPageView is available under the MIT license. See the LICENSE file for more info.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,053评论 3 119
  • 用到的组件 1、通过CocoaPods安装 2、第三方类库安装 3、第三方服务 友盟社会化分享组件 友盟用户反馈 ...
    SunnyLeong阅读 14,961评论 1 180
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,373评论 4 61
  • 第一次用简书,希望能在上面写一些读书心得。
    南plus阅读 1,670评论 0 0
  • 第一天 早上好小公主! 1.感谢每天早上醒来,开始神奇的一天,谢谢,谢谢,谢谢! 2.我很幸福,很开心,感谢每天都...
    想信有阅读 1,351评论 0 0

友情链接更多精彩内容