当前位置: 首页 > 编程日记 > 正文

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

原文链接: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


相关文章:

Git简明手册

文&#xff0f;AbnerKang&#xff08;简书作者&#xff09;原 文链接&#xff1a;http://www.jianshu.com/p/d7a7ba4f2341?utm_campaignmaleskine& utm_contentnote&utm_mediumreader_share&utm_sourceweixin&fromtimeline&isappinstalled0著作权归作者所…

今天是2013年06月21日,博客之路开始了!

RT&#xff0c;从今天开始&#xff0c;准备养成写博客的习惯。 一是对学习的成果进行总结  二是检验自己是否真的弄懂某一个问题  三是分享出来与大家共勉。从此开启我的程序人生之路吧&#xff01;转载于:https://www.cnblogs.com/penghongwei/p/3147999.html

OpenStack环境搭建(四:web控制端各节点的部署及配置)

实验要求&#xff1a; 完成Virtual box平台安装&#xff0c;会应用相关操作&#xff1b;在virtual box虚拟平台上部署Fuel Master节点&#xff1b;在virtual box虚拟平台上部署计算节点Computer&#xff1b;在virtual box虚拟平台上部署控制节点Controller&#xff1b;在web控…

Spring+SpringMVC+shiro+mysql(一)

SpringSpringMVCshiromysql&#xff08;一&#xff09; 最近要做个后台管理系统&#xff0c;就会设计到权限的管理控制&#xff0c;于是就想到 shiro &#xff0c;下面是自己对Springshiro的一点点理解&#xff0c;记录下来&#xff0c;一起多探讨&#xff1a; 项目结构 1. pom…

【iOS】Socket/TCP 通信 发送 NSString 字符串格式数据

Socket/TCP 原理这里就不阐述了&#xff0c;网上一搜一大堆&#xff0c;直接上关键代码。 【注】iOS 目前有非常著名的第三方库 CocoaAsyncSocket 可以使用&#xff0c;但是我们项目当时做大数据上报要求直接发送 NSString 格式数据&#xff0c;所以自己写了一个简易版 TCP 连接…

[Win]进程间通信——邮槽Mailslot

进程间通信 进程的地址空间是私有的。出于安全性的目的&#xff0c;如果一个进程不具有特殊的权限&#xff0c;是无法访问另外一个进程的内存空间的&#xff0c;也无法知道内存中保存的数据的意义。但是在一些具体的应用情况下需要多个进行相互配合&#xff0c;有时计算机用户也…

OpenStack环境搭建(五:附加项虚拟机文件备份使用)

实验要求&#xff1a; 完成Virtual box平台安装&#xff0c;会应用相关操作&#xff1b;在virtual box虚拟平台上部署Fuel Master节点&#xff1b;在virtual box虚拟平台上部署计算节点Computer&#xff1b;在virtual box虚拟平台上部署控制节点Controller&#xff1b;在web控…

IOS入门-TargetAction

创建一个UIButton 并用Target - Action来监听它的点击事件 Target -- self控制器 Action -- 具体动作&#xff0c;self控制器中的某个方法 forControlEvents:UIControlEventTouchUpInside -- 表示监听的事件 1 - (void)btnclick:(id)sender2 {3 NSLog("点击%" ,…

【iOS_Development】文件操作

原文链接&#xff1a;http://www.jianshu.com/p/c5820ab6836biOS 文件操作 —— 由anticipate_91分享NSFileManager&#xff1a;是用来管理文件系统的&#xff0c;它可以用来进行常见的文件\文件夹操作获取NSFileManager示例[NSFileManager defaultManager] 增删改查 1. 创建文…

仿人智能控制器的参数简化(已发表于《计算机测量与控制》2013年第4期)

转载于:https://www.cnblogs.com/snake-hand/p/3153313.html

OpenStack环境搭建(六:常见问题及解决方案总结)

实验要求&#xff1a; 完成Virtual box平台安装&#xff0c;会应用相关操作&#xff1b;在virtual box虚拟平台上部署Fuel Master节点&#xff1b;在virtual box虚拟平台上部署计算节点Computer&#xff1b;在virtual box虚拟平台上部署控制节点Controller&#xff1b;在web控…

工作区和暂存区

Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。 先来看名词解释。 工作区&#xff08;Working Directory&#xff09; 就是你在电脑里能看到的目录&#xff0c;比如我的learngit文件夹就是一个工作区&#xff1a; 版本库&#xff08;Repository&#xff09; 工…

Lucene类介绍

IndexWriter:lucene中最重要的的类之一&#xff0c;它主要是用来将文档加入索引&#xff0c;同时控制索引过程中的一些参数使用。 Analyzer luceneAnalyzer new StandardAnalyzer(); IndexWriter indexWriter new IndexWriter(indexDir, luceneAnalyzer, true );…

iOS 开发之沙盒机制 文件操作 (NSFielManager)

原文链接&#xff1a;http://www.jianshu.com/p/349855b5a8aeiOS APP 可以在自己的沙盒里读写文件&#xff0c;但是&#xff0c;不可以访问其他 APP 的沙盒。每一个 APP 都是一个信息孤岛&#xff0c;相互是不可以进行通信的&#xff0c;唯独可以通过 URL Scheme。沙盒里面的文…

手动部署OpenStack环境(一:Virtual Box 5.1 环境的安装及配置)

任务一、Virtual Box 5.1 环境的安装及配置 1.1、安装环境检查 1.2、创建安装目录 1.3、安装及配置 实验目的及要求 完成Virtual box平台安装&#xff0c;会应用相关操作&#xff1b;在virtual box虚拟平台上部署网络节点Network&#xff1b;在virtual box虚拟平台上部署计算…

iOS动画系列之九:实现点赞的动画及播放起伏指示器

iOS动画系列&#xff0c;共十篇。现在写到第九篇啦。感兴趣的可以通过下面的传输门进到其他几篇文章里面。 第一篇&#xff1a;iOS动画系列之一&#xff1a;通过实战学习CALayer和透视的原理。做一个带时分秒指针的时钟动画(上) 第二篇&#xff1a;iOS动画系列之二&#xff1a;…

MySql5.7环境搭建

1. 安装mysql的linux系统 [rootgrewan ~]# cat /etc/redhat-release CentOS release 6.7 (Final) [rootgrewan ~]# uname -a Linux grewan 2.6.32-573.26.1.el6.x86_64 #1 SMP Wed May 4 00:57:44 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux [rootgrewan ~]# 注意&#xff1a;l…

Toad 修改起始窗口

Toad默认窗口时Editor&#xff0c; 如果想要修改为Schema Browser可以通过以下步骤进行修改&#xff08;以Toad9.6为例&#xff09;&#xff1a; 1&#xff0c;点击菜单栏上的View下拉菜单 2&#xff0c;选择Toad Options...菜单 3&#xff0c;在打开窗口的左边功能列表中找到并…

手动部署OpenStack环境(二:CentOS6.6虚拟机的安装及配置)

任务二、CentOS 6.6虚拟机的安装及配置 2.1、安装环境检查 2.2、安装及配置controller0节点 2.3、安装及配置computer0节点 2.4、安装及配置network0节点 2.5、对各节点进行基础配置及服务安装 任务二&#xff1a;CentOS6.6虚拟机的安装及配置 2.1、安装环境检查 2.1.1在…

练习-----查询

第一步&#xff1a;建表 1 create table student #学生表2 (3 Sno varchar(20) primary key, #学号&#xff0c;主键4 Sname varchar(20) not null, #学生姓名5 Ssex varchar(20) not null, #学生性别6 Sbirthday datetime, #学生出生日期7 Class …

UIActivityViewController使用

苹果从iOS6开始&#xff0c;提供了一个活动列表视图&#xff0c;为分享和操作数据提供了一个统一的服务接口&#xff0c;通过UIActivityViewController来控制它的呈现和关闭&#xff0c;凡是继承UIActivity抽象类的子类对象都可以放在列表中呈现出来。如下图所示&#xff1a; 活…

SQL Server系统表sysobjects介绍与使用

关于SQL Server数据库的一切信息都保存在它的系统表格里。我怀疑你是否花过比较多的时间来检查系统表格&#xff0c;因为你总是忙于用户表格。但是&#xff0c;你可能需要偶尔做一点不同寻常的事&#xff0c;例如数据库所有的触发器。你可以一个一个地检查表格&#xff0c;但是…

手动部署OpenStack环境(三:OpenStack环境预配置)

任务三、OpenStack环境预配置 3.1、本地OpenStack yum源制作 任务三&#xff1a;OpenStack环境预配置 3.1、本地OpenStack yum 源制作 3.1.1、拷贝镜像文件源到本地 3.1.2、查看createrepo是否安装&#xff0c;并使用yum方法安装。 &#xff08;此操作只在controller0主机进…

Java 集合框架(二)—— ArrayList

二、数组列表 —— ArrayList 1、构造方法 ArrayList 是 Java 中的动态数组&#xff0c;底层实现就是对象数组&#xff0c;只不过数组的容量会根据情况来改变。 它有个带 int 类型参数的构造方法&#xff0c;根据传入的参数&#xff0c;扩展初始化的数组容量&#xff0c;这个方…

Linux X Window System运行原理和启动过程

本文主要说明X Window System的基本运行原理&#xff0c;其启动过程&#xff0c;及常见的跨网络运行X Window System。 一) 基本运行原理 X Window System采用C/S结构&#xff0c;但和我们常见的C/S不同。常见的C/S结构中&#xff0c;称提供服务的一方为server&#xff0c;即服…

悬浮球 / 悬浮按钮 / 辅助按钮

原文链接&#xff1a;https://github.com/jinht/FloatingBall类似于 iOS 系统自带的 AssistiveTouch / 京东 / 聚划算 / 建行等的辅助按钮 —— 由anticipate_91分享FloatingBall Function Description 这是一个类似于iOS系统自带的AssistiveTouch/京东《我的》部分的悬浮按钮等…

手动部署OpenStack环境(四:安装控制器必备软件)

任务四、安装控制器必备组件 4.1、安装MySQL服务&#xff08;controller0&#xff09; 4.2、安装Rabbitmq消息队列&#xff08;controller0&#xff09; 4.3、Keystone认证&#xff08;controller0&#xff09; 4.4、glance的安装与配置&#xff08;controller0&#xff09; 4.…

cocoaPods安装、更新第三方库

pod install 换成 pod install --verbose --no-repo-update pod update 换成 pod update --verbose --no-repo-update这是因为&#xff1a;目前&#xff0c;cocoaPods正在被墙中......转载于:https://www.cnblogs.com/hello-Huashan/p/5542456.html

iOS 性能优化总结

原文链接&#xff1a;https://github.com/skyming/iOS-Performance-Optimization关于 iOS 性能优化梳理&#xff1a; 基本工具、业务优化、内存优化、卡顿优化、布局优化、电量优化、 安装包瘦身、启动优化、网络优化等 —— 由_skyming_分享关于iOS 性能优化梳理&#xff1a; …

TCP/IP协议分析

一;前言 学习过TCP/IP协议的人多有一种感觉&#xff0c;这东西太抽象了&#xff0c;没有什么数据实例&#xff0c;看完不久就忘了。本文将介绍一种直观的学习方法&#xff0c;利用协议分析工具学习TCP/IP&#xff0c;在学习的过程中能直观的看到数据的具体传输过程。 为了初学者…