在网页开发当中跑马灯是常用到的,用来显示通知等,在游戏开发当中也如此。

首先来看看效果图:
接下来就简单看看这效果是怎么实现的。
实现方法
1、首先我们从这个图片里面能联想到如果实现这个效果必然需要使用到动画,或者还有有用scrollView的思路,这里我是用的动画的方式实现的。
2、.h文件
自定义一个继承UIView的LGJAutoRunLabel类,在.h文件中:
@class LGJAutoRunLabel;
typedef NS_ENUM(NSInteger, RunDirectionType) {
LeftType = 0,
RightType = 1,
};
@protocol LGJAutoRunLabelDelegate <NSObject>
@optional
- (void)operateLabel: (LGJAutoRunLabel *)autoLabel animationDidStopFinished: (BOOL)finished;
@end
@interface LGJAutoRunLabel : UIView
@property (nonatomic, weak) id <LGJAutoRunLabelDelegate> delegate;
@property (nonatomic, assign) CGFloat speed;
@property (nonatomic, assign) RunDirectionType directionType;
- (void)addContentView: (UIView *)view;
- (void)startAnimation;
- (void)stopAnimation;
定义一个NS_ENUM用来判断自动滚动的方向,分别是左和右,声明一个可选类型的协议,用来在controller中调用并对autoLabel进行操作。声明对外的属性和方法。这里一目了然,主要的实现思路都集中在.m文件中。
3、.m文件
声明“私有”变量和属性:
@interface LGJAutoRunLabel()<CAAnimationDelegate>
{
CGFloat _width;
CGFloat _height;
CGFloat _animationViewWidth;
CGFloat _animationViewHeight;
BOOL _stoped;
UIView *_contentView;//滚动内容视图
}
@property (nonatomic, strong) UIView *animationView;//放置滚动内容视图
@end
初始化方法:
- (instancetype)initWithFrame:(CGRect)frame {
if (self == [super initWithFrame:frame]) {
_width = frame.size.width;
_height = frame.size.height;
self.speed = 1.0f;
self.directionType = LeftType;
self.layer.masksToBounds = YES;
self.animationView = [[UIView alloc] initWithFrame:CGRectMake(_width, 0, _width, _height)];
[self addSubview:self.animationView];
}
return self;
}
将滚动内容视图contentView添加到动画视图animationView上:
- (void)addContentView:(UIView *)view {
[_contentView removeFromSuperview];
view.frame = view.bounds;
_contentView = view;
self.animationView.frame = view.bounds;
[self.animationView addSubview:_contentView];
_animationViewWidth = self.animationView.frame.size.width;
_animationViewHeight = self.animationView.frame.size.height;
}
让animationView上的contentView自动滚动起来的主要方法在这儿,重点来了,就是这个- (void)startAnimation方法,看一下这个方法里面是怎么样实现的:
- (void)startAnimation {
[self.animationView.layer removeAnimationForKey:@"animationViewPosition"];
_stoped = NO;
CGPoint pointRightCenter = CGPointMake(_width + _animationViewWidth / 2.f, _animationViewHeight / 2.f);
CGPoint pointLeftCenter = CGPointMake(-_animationViewWidth / 2, _animationViewHeight / 2.f);
CGPoint fromPoint = self.directionType == LeftType ? pointRightCenter : pointLeftCenter;
CGPoint toPoint = self.directionType == LeftType ? pointLeftCenter : pointRightCenter;
self.animationView.center = fromPoint;
UIBezierPath *movePath = [UIBezierPath bezierPath];
[movePath moveToPoint:fromPoint];
[movePath addLineToPoint:toPoint];
CAKeyframeAnimation *moveAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
moveAnimation.path = movePath.CGPath;
moveAnimation.removedOnCompletion = YES;
moveAnimation.duration = _animationViewWidth / 30.f * (1 / self.speed);
moveAnimation.delegate = self;
[self.animationView.layer addAnimation:moveAnimation forKey:@"animationViewPosition"];
}
↘️首先先把animationView.layer上的动画移除掉,接下来就是要找到animationView\contentView的pointCenter这里把这个中点当做是animationView或者是contentView都行,因为这两个视图的frame是相等的,这步找左右中点的意义在于,完全显示出文字内容,因为可能会遇到那种比如文字太长了,view长度不够,不能完全显示出来文字的全部内容, 这里我们找到中点,也就相当于确定了内容视图要滑动的范围了,接下来根据起始方向的枚举值设置fromPoint和toPoint这里我们默认是从右向左滚动的。这里我们做动画设置,用到了贝塞尔曲线,我们设置UIBezierPath的起始位置就是fromPoint也就是屏幕右方(我们看不见)self.animationView.center。终止位置是屏幕左方toPoint此时animationView滚动的起始位置的首和终止位置的尾的距离正好是屏幕的宽度。这里我们使用CAKeyframeAnimation关键帧动画,moveAnimation.path = movePath.CGPath; ,moveAnimation.removedOnCompletion = YES;动画完成后就将动画移除,不保留最终的状态。 [self.animationView.layer addAnimation:moveAnimation forKey:@"animationViewPosition"];将动画添加到animationView.layer上。
(这段是对上面代码的解释)
-------------------分割线-------------------
接下来的这个就是代理方法的实现了,当动画完成后悔调用LGJAutoRunLabelDelegate我们自定义的delegate方法。
- (void)stopAnimation {
_stoped = YES;
[self.animationView.layer removeAnimationForKey:@"animationViewPosition"];
}
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
if (self.delegate && [self.delegate respondsToSelector:@selector(operateLabel:animationDidStopFinished:)]) {
[self.delegate operateLabel:self animationDidStopFinished:flag];
}
if (flag && !_stoped) {
[self startAnimation];
}
}
4、在controller中使用方法
主要的方法就是声明LGJAutoRunLabel实例,将代理设为自身,声明directionType默认为Left,在runLabel上创建label也就是我们看到的文字。其余方法一目了然了。
//MARK:- CreateAutoRunLabel
- (void)createAutoRunLabel {
LGJAutoRunLabel *runLabel = [[LGJAutoRunLabel alloc] initWithFrame:CGRectMake(0, 100, kWidth, 50)];
runLabel.delegate = self;
runLabel.directionType = LeftType;
[self.view addSubview:runLabel];
[runLabel addContentView:[self createLabelWithText:@"繁华声 遁入空门 折煞了梦偏冷 辗转一生 情债又几 如你默认 生死枯等 枯等一圈 又一圈的 浮图塔 断了几层 断了谁的痛直奔 一盏残灯 倾塌的山门 容我再等 历史转身 等酒香醇 等你弹 一曲古筝" textColor:[selfrandomColor] labelFont:[UIFont systemFontOfSize:14]]];
[runLabel startAnimation];
}
- (UILabel *)createLabelWithText: (NSString *)text textColor:(UIColor *)textColor labelFont:(UIFont *)font {
NSString *string = [NSString stringWithFormat:@"%@", text];
CGFloat width = [UILabel getWidthByTitle:string font:font];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, width, 50)];
label.font = font;
label.text = string;
label.textColor = textColor;
return label;
}
- (UIColor *)randomColor {
return [UIColor colorWithRed:[self randomValue] green:[self randomValue] blue:[self randomValue] alpha:1];
}
- (CGFloat)randomValue {
return arc4random()%255 / 255.0f;
}
总结
这个例子挺小的,主要思路就是利用动画将其变活,可能不太好理解的地方就是在动画移动的path这个路径的距离上,我们想这个路径的时候肯定要这样想,我让动画从最初我看不见的地方出现,然后最后到我看不见的地方消失,这个中间的距离之差就是屏幕的宽度了,而这个屏幕的宽度正好我们可以用contentView.frame来表示。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
# ios实现跑马灯效果
# ios
# 跑马灯label
# 文字跑马灯效果
# 学习iOS全局跑马灯
# iOS在固定的label上动态显示所有文字
# iOS使用UICountingLabel实现数字变化的动画效果
# iOS实现知乎和途家导航栏渐变的文字动画效果
# ios动态设置lbl文字标签的高度
# iOS 屏幕解锁文字动画效果
# iOS应用中UILabel文字显示效果的常用设置总结
# 跑马灯效果大全
# 基于Jquery的文字滚动跑马灯插件(一个页面多个滚动区)
# js跑马灯代码(自写)
# 自定义
# 移除
# 我是
# 遁入空门
# 来了
# 我看
# 也就
# 是怎么
# 可以用
# 设为
# 到我
# 是从
# 将其
# 这段
# 这两个
# 或者是
# 等你
# 来看看
# 可选
# 并对
相关文章:
制作营销网站公司,淘特是干什么用的?
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
建站168自助建站系统:快速模板定制与SEO优化指南
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
如何打造高效商业网站?建站目的决定转化率
如何彻底卸载建站之星软件?
如何通过老薛主机一键快速建站?
nginx修改上传文件大小限制的方法
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
婚礼视频制作网站,学习*后期制作的网站有哪些?
如何用搬瓦工VPS快速搭建个人网站?
常州自助建站工具推荐:低成本搭建与模板选择技巧
如何通过WDCP绑定主域名及创建子域名站点?
企业微网站怎么做,公司网站和公众号有什么区别?
网站制作员失业,怎样查看自己网站的注册者?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
网站制作新手教程,新手建设一个网站需要注意些什么?
建站主机选购指南与交易推荐:核心配置解析
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
如何快速生成可下载的建站源码工具?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
清除minerd进程的简单方法
如何在腾讯云服务器上快速搭建个人网站?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
香港服务器选型指南:免备案配置与高效建站方案解析
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
如何选择域名并搭建高效网站?
建站之星图片链接生成指南:自助建站与智能设计教程
如何用景安虚拟主机手机版绑定域名建站?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
香港网站服务器数量如何影响SEO优化效果?
如何用y主机助手快速搭建网站?
网站制作软件有哪些,制图软件有哪些?
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
如何高效利用亚马逊云主机搭建企业网站?
如何快速搭建高效简练网站?
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
建站之星如何实现五合一智能建站与营销推广?
成都响应式网站开发,dw怎么把手机适应页面变成网页?
活动邀请函制作网站有哪些,活动邀请函文案?
如何用AWS免费套餐快速搭建高效网站?
如何选择CMS系统实现快速建站与SEO优化?
如何通过免费商城建站系统源码自定义网站主题与功能?
如何批量查询域名的建站时间记录?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
建站之星好吗?新手能否轻松上手建站?
如何将凡科建站内容保存为本地文件?
h5网站制作工具有哪些,h5页面制作工具有哪些?
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
linux top下的 minerd 木马清除方法
*请认真填写需求信息,我们会在24小时内与您取得联系。