原文链接:http://www.jianshu.com/p/7221bc08f26a
SKAutoScrollLabel 是一个同时支持水平 / 垂直两种类型的 “跑马灯” 效果的自动滚动 UILabel。在滚动的边缘使用了梯度褪色来解决滚动边缘生硬的效果问题,总体效果呈现出混然天成的感觉,并且使用简单方便。 —— 由ShevaKuilin分享

简述

SKAutoScrollLabel是一个同时支持水平/垂直两种类型的“跑马灯”效果的自动滚动UILabel。在滚动的边缘使用了梯度褪色来解决滚动边缘生硬的效果问题,总体效果呈现出混然天成的感觉,并且使用简单方便。如果你觉得还不错,请star支持一下吧~

效果图

如何开始

1.从GitHub上Clone-->SKAutoScrollLabel,然后查看Demo

2.直接将目录下的SKAutoScrollLabel拷贝到工程中,或在podfile文件夹中添加 pod 'SKAutoScrollLabel'

使用方法

初始化

SKAutoScrollLabel * leftLabel = [[SKAutoScrollLabel alloc] initWithFrame:CGRectMake(50, 50, [UIScreen mainScreen].bounds.size.width - 100, 50)];
[self.view addSubview:leftLabel];

基本设置

leftLabel.backgroundColor = [UIColor blackColor];// 背景色
leftLabel.textColor = [UIColor whiteColor];// 字体颜色
leftLabel.font = [UIFont systemFontOfSize:16];// 字体大小
leftLabel.direction = SK_AUTOSCROLL_DIRECTION_LEFT;// 滚动方向,这是向左滚动
leftLabel.text = text;// 显示内容

实现

※ 这里仅列出关键步骤,具体方法请查阅源码

  1. 我们需要创建一个数组,来存放我们滚动时所需要展示的label,这里我们只创建两个label存放到数组中即可(滚动只需要两个即可达成持续跑马灯的效果)

    // 创建label数组NSMutableSet * labelSet = [[NSMutableSet alloc] init];for (NSInteger i = 0; i < kLabelCount; i++) {UILabel * label = [UILabel new];label.backgroundColor = [UIColor clearColor];label.autoresizingMask = self.autoresizingMask;label.frame = CGRectMake(0, 0, 50, 50);[self.scrollView addSubview:label];[labelSet addObject:label];}self.labels = [labelSet.allObjects copy];

2.区分水平和垂直的UILabel

static void each_object(NSArray *objects, void (^block)(UILabel * label)) {for (UILabel * label in objects) {block(label);}
}
__block float offset = 0;// 遍历label数组中的元素each_object(self.labels, ^(UILabel *label) {[label sizeToFit];CGRect frame = label.frame;// 垂直if (self.direction != SK_AUTOSCROLL_DIRECTION_RIGHT && self.direction != SK_AUTOSCROLL_DIRECTION_LEFT) {// 动态获取长度和高度, 以此达到将label垂直的目的NSDictionary * attribute = [NSDictionary dictionaryWithObjectsAndKeys:self.font,NSFontAttributeName, nil];CGSize sizeWord = [@"一" boundingRectWithSize:self.bounds.size options:NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin attributes:attribute context:nil].size;CGFloat wordWidth = sizeWord.width;CGSize sizeStr = [self.text boundingRectWithSize:CGSizeMake(wordWidth, CGFLOAT_MAX) options:NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin attributes:attribute context:nil].size;CGFloat wordHeight = sizeStr.height;frame.origin = CGPointMake((CGRectGetWidth(self.frame) / 2) - (wordWidth / 2), offset);frame.size = CGSizeMake(wordWidth, wordHeight);label.frame = frame;label.numberOfLines = 0;offset += CGRectGetHeight(label.bounds) + self.labelSpacing;} else {// 水平frame.origin = CGPointMake(offset, 0);frame.size.height = CGRectGetHeight(self.bounds);label.frame = frame;offset += CGRectGetWidth(label.bounds) + self.labelSpacing;// 重新定位label在scrollview中的位置label.center = CGPointMake(label.center.x, roundf(self.center.y - CGRectGetMinY(self.frame)));}});

3.判断滚动条件,是否允许滚动

// (水平方向) 判断当前scrollLabel是否大于self的宽度,如果是就开始滚动if (CGRectGetWidth(self.scrollLabel.bounds) > CGRectGetWidth(self.bounds)) {CGSize size = CGSizeMake(CGRectGetWidth(self.scrollLabel.bounds) + CGRectGetWidth(self.bounds) + self.labelSpacing,  CGRectGetHeight(self.bounds));self.scrollView.contentSize = size;EACH_LABEL(hidden, NO);[self applyGradientMaskForFadeLength:kDefaultFadeLength enableFade:self.scrolling];[self scrollLabelIfNeeded];} else if (CGRectGetHeight(self.scrollLabel.bounds) > CGRectGetHeight(self.bounds)) {// (垂直方向) 判断当前scrollLabel是否大于self的高度,如果是就开始滚动CGSize size = CGSizeMake(CGRectGetWidth(self.bounds), CGRectGetHeight(self.scrollLabel.bounds) + self.labelSpacing);self.scrollView.contentSize = size;EACH_LABEL(hidden, NO);[self applyGradientMaskForFadeLength:kDefaultFadeLength enableFade:self.scrolling];[self scrollLabelIfNeeded];} else {// 隐藏其他labelEACH_LABEL(hidden, self.scrollLabel != label);// 调整scrollView和scrollLabelself.scrollView.contentSize = self.bounds.size;self.scrollLabel.frame = self.bounds;self.scrollLabel.hidden = NO;self.scrollLabel.textAlignment = NSTextAlignmentCenter;[self.scrollView.layer removeAllAnimations];[self applyGradientMaskForFadeLength:0 enableFade:NO];}

4.自动滚动动画

switch (self.direction) {// 滚动方向case SK_AUTOSCROLL_DIRECTION_LEFT:self.scrollView.contentOffset = CGPointZero;break;case SK_AUTOSCROLL_DIRECTION_RIGHT:self.scrollView.contentOffset = CGPointMake(width + self.labelSpacing, 0);break;case SK_AUTOSCROLL_DIRECTION_TOP:self.scrollView.contentOffset = CGPointZero;break;case SK_AUTOSCROLL_DIRECTION_BOTTOM:self.scrollView.contentOffset = CGPointMake(0, height - 10 - CGRectGetHeight(self.bounds));break;}// 滚动动画, UIViewAnimationOptionRepeat一直重复动画[UIView animateWithDuration:duration delay:self.autoScrollInterval options:UIViewAnimationOptionRepeat animations:^{switch (self.direction) {case SK_AUTOSCROLL_DIRECTION_LEFT:self.scrollView.contentOffset = CGPointMake(width + self.labelSpacing, 0);break;case SK_AUTOSCROLL_DIRECTION_RIGHT:self.scrollView.contentOffset = CGPointZero;break;case SK_AUTOSCROLL_DIRECTION_TOP:self.scrollView.contentOffset = CGPointMake(0, CGRectGetHeight(self.scrollLabel.bounds) + self.labelSpacing);break;case SK_AUTOSCROLL_DIRECTION_BOTTOM:self.scrollView.contentOffset = CGPointZero;break;}} completion:^(BOOL finished) {_scrolling = NO;// 移除阴影[self applyGradientMaskForFadeLength:kDefaultFadeLength enableFade:NO];// 完成后循调用if (finished) {[self performSelector:@selector(scrollLabelIfNeeded)];}}];

5.使用CAGradientLayer在滚动边缘的制造梯度褪色效果

        // 创建梯度mask和消失长度CAGradientLayer * gradientMask = [CAGradientLayer layer];gradientMask.bounds = self.layer.bounds;gradientMask.position = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));gradientMask.shouldRasterize = YES;gradientMask.rasterizationScale = [UIScreen mainScreen].scale;CGFloat fadePoint = 0;// 垂直方向的梯度褪色if (self.direction != SK_AUTOSCROLL_DIRECTION_RIGHT && self.direction != SK_AUTOSCROLL_DIRECTION_LEFT) {gradientMask.startPoint = CGPointMake(CGRectGetMidX(self.frame), 0);gradientMask.endPoint = CGPointMake(CGRectGetMidX(self.frame), 1);fadePoint = fadeLength / CGRectGetHeight(self.bounds);// 水平方向的梯度褪色} else {gradientMask.startPoint = CGPointMake(0, CGRectGetMidY(self.frame));gradientMask.endPoint = CGPointMake(1, CGRectGetMidY(self.frame));fadePoint = fadeLength / CGRectGetWidth(self.bounds);}// 设置渐变mask颜色和位置id transparent = (id)[UIColor clearColor].CGColor;id opaque = (id)[UIColor blackColor].CGColor;gradientMask.colors = @[transparent, opaque, opaque, transparent];// 计算褪色NSNumber * leftFadePoint = @(fadePoint);NSNumber * rightFadePoint = @(1 - fadePoint);if (!fade) {switch (self.direction) {case SK_AUTOSCROLL_DIRECTION_LEFT:leftFadePoint = @0;break;case SK_AUTOSCROLL_DIRECTION_RIGHT:leftFadePoint = @0;rightFadePoint = @1;break;case SK_AUTOSCROLL_DIRECTION_TOP:leftFadePoint = @0;break;case SK_AUTOSCROLL_DIRECTION_BOTTOM:leftFadePoint = @0;rightFadePoint = @1;break;}}// 将计算结果交给maskgradientMask.locations = @[@0, leftFadePoint, rightFadePoint, @1];[CATransaction begin];[CATransaction setDisableActions:YES];self.layer.mask = gradientMask;[CATransaction commit];

感谢你花时间阅读以上内容, 如果这个项目能够帮助到你,记得告诉我

Email: shevakuilin@gmail.com

iOS - 支持水平 / 垂直显示自动滚动的跑马灯控件 --- SKAutoScrollLabel 的使用和实现相关推荐

  1. html网页内容自动滚动实现跑马灯效果

    1.效果1 超出div高度,文本自动滚动(像跑马灯一样从下往上滚动) 一个div里面有文字 1.如果文字没超出div高度:文字不用滚动 2.如果文字太多超出了div高度,那些文字就自动滚动 ps:滚动 ...

  2. WPF中DataGrid自动滚动,跑马灯效果实现

    前端: <DataGrid x:Name="dg" AutoGenerateColumns="False" ><DataGrid.Column ...

  3. C# 网络编程之网页自动登录 (一).使用WebBrower控件模仿登录

    C# 网络编程之网页自动登录 (一).使用WebBrower控件模仿登录 最近学习C#网络编程中,想实现网页自动登录并提交GET/POST信息,再实现循环登录不断发送报文给服务器,服务器发送消息给客户 ...

  4. calendar控件使用 extjs_ExtJs定制日历控件——自动加载更新(日历控件显示)

    将定制的日历控件放到一个Panel里显示,其结构如下: , { border: true, id: 'page', animCollapse : true, width: 1050, height: ...

  5. android多个下拉控件,Android实现支持所有View的通用的下拉刷新控件

    下拉刷新对于一个app来说是必不可少的一个功能,在早期大多数使用的是chrisbanes的PullToRefresh,或是修改自该框架的其他库.而到现在已经有了更多的选择,github上还是有很多体验 ...

  6. Android 怎么实现支持所有View的通用的下拉刷新控件

    转载请标明出处: http://blog.csdn.net/u010386612/article/details/51372696 本文出自:[AItsuki的博客] 下拉刷新对于一个app来说是必不 ...

  7. 手机屏大字滚动_LED跑马灯屏-LED跑马灯屏App下载-

    LED跑马灯屏软件是一款模拟LED显示屏应用软件,LED跑马灯软件可轻易实现发光LED跑马灯,使用这款LED跑马灯软件可以随你喜欢自行定义滚动的文字和文字样式. LED跑马灯软件是演唱会电子灯牌.机场 ...

  8. 页面实现文字滚动效果(跑马灯)

    页面的自动滚动效果,可由javascript来实现,但是今天无意中发现了一个html标签 - <marquee></marquee>可以实现多种滚动效果,无需js控制.使用ma ...

  9. AngularJS 无限滚动加载数据控件 ngInfiniteScroll

    为什么80%的码农都做不了架构师?>>>    1.什么是 InfiniteScroll?  无限滚动(Infinite Scroll)也称为自动分页.滚动分页和无限分页.常用在图片 ...

最新文章

  1. [JavaScript] 探索JS中的函数秘密
  2. Spring从菜鸟到高手(四)(上)使用JdbcTemplate类实现用户登陆验证、批量更新
  3. python文件句柄_Python文件操作
  4. 2.5英寸硬盘何止“五脏俱全”(硬盘构造再揭秘之四)
  5. java如何定义一个字符栈_Java性能优化之字符串优化处理
  6. 如何实现一个分布式 RPC 框架
  7. 区块链创业的成功范式,人工智能不得不学
  8. 在VS2005的工具箱中增加SharePoint的活动
  9. 企业级应用框架(五)IOC容器在框架中的应用
  10. cf 1059e 思维 贪心 树
  11. IPv6名称到地址的转换函数getaddrinfo()详解
  12. Java描述设计模式(22):策略模式
  13. JavaMail基本使用
  14. java每一个小时同步_Java同步块(synchronized block)使用详解
  15. Android Lint简介
  16. Windows mobile 下读取手机SIM卡信息
  17. BZOJ 4516 后缀数组+ST+set
  18. [转]BAT 批处理脚本 教程
  19. funcode黄金矿工(提高篇)
  20. 基于51单片机的红外接收

热门文章

  1. 简谈 Java 中的泛型通配符
  2. 在DataTable中更新、删除数据
  3. mac下安装libpng环境
  4. [UT]Unit Test理解
  5. ArrayList Iterator remove java.lang.UnsupportedOperationException
  6. ASP.NET 3.5揭秘-读书笔记1
  7. 在apache中使用 memcache 来作 session 存储
  8. Java的Redis连接池代码性能不错
  9. Linux下addr2line命令用法
  10. 【FFmpeg】ffmpeg工具源码分析(一):main函数