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.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

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