iOS 中UIlabel文字滚动动画
BBFlashCtntLabel文件
#import <UIKit/UIKit.h>
typedef NS_ENUM(NSInteger, BBFlashCtntSpeed) {
BBFlashCtntSpeedSlow = -1,
BBFlashCtntSpeedMild,
BBFlashCtntSpeedFast
};
@interface BBFlashCtntLabel : UIView
@property (nonatomic, strong) NSString *text;
@property (nonatomic, strong) UIFont *font; // 默认:system(15)
@property (nonatomic, strong) UIColor *textColor;
@property (nonatomic, strong) NSAttributedString *attributedText;
@property (nonatomic, assign) BBFlashCtntSpeed speed;
// 循环滚动次数(为0时无限滚动)
@property (nonatomic, assign) NSUInteger repeatCount;
@property (nonatomic, assign) CGFloat leastInnerGap;
- (void)reloadView;
@end
BBFlashCtntLabel文件
#import "BBFlashCtntLabel.h"
@interface BBFlashCtntLabel()
{
BOOL seted;
BOOL moveNeed;
CGFloat rate;
}
@property (nonatomic, strong) UIView *innerContainer;
@end
@implementation BBFlashCtntLabel
- (void)awakeFromNib
{
[super awakeFromNib];
self.font = [UIFont systemFontOfSize:15];
self.textColor = [UIColor blackColor];
self.speed = BBFlashCtntSpeedMild;
self.repeatCount = 0;
self.leastInnerGap = 10.f;
self.clipsToBounds = YES;
rate = 80.f;
[self setup];
}
- (instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
self.font = [UIFont systemFontOfSize:15];
self.textColor = [UIColor blackColor];
self.speed = BBFlashCtntSpeedMild;
self.repeatCount = 0;
self.leastInnerGap = 10.f;
self.clipsToBounds = YES;
[self setup];
}
return self;
}
- (void)setSpeed:(BBFlashCtntSpeed)speed
{
_speed = speed;
switch (_speed) {
case BBFlashCtntSpeedFast:
rate = 90.;
break;
case BBFlashCtntSpeedMild:
rate = 75;
break;
case BBFlashCtntSpeedSlow:
rate = 40.;
break;
default:
break;
}
[self reloadView];
}
- (void)setLeastInnerGap:(CGFloat)leastInnerGap
{
_leastInnerGap = leastInnerGap;
[self reloadView];
}
- (void)setText:(NSString *)text
{
_text = text;
_attributedText = nil;
[self reloadView];
}
- (void)setAttributedText:(NSAttributedString *)attributedText
{
_attributedText = [self setAttributedTextDefaultFont:attributedText];
_text = nil;
[self reloadView];
}
- (NSAttributedString *)setAttributedTextDefaultFont:(NSAttributedString *)attrText
{
NSMutableAttributedString *rtn = [[NSMutableAttributedString alloc] initWithAttributedString:attrText];
void (^enumerateBlock)(id, NSRange, BOOL *) = ^(id value, NSRange range, BOOL *stop) {
if (!value || [value isKindOfClass:[NSNull class]]) {
[rtn addAttribute:NSFontAttributeName
value:self.font
range:range];
}
};
[rtn enumerateAttribute:NSFontAttributeName
inRange:NSMakeRange(0, rtn.string.length)
options:0
usingBlock:enumerateBlock];
return rtn;
}
- (void)setFont:(UIFont *)font
{
_font = font;
[self reloadView];
}
- (void)setTextColor:(UIColor *)textColor
{
_textColor = textColor;
[self reloadView];
}
- (void)setup
{
if (seted) {
return ;
}
self.innerContainer = [[UIView alloc] initWithFrame:self.bounds];
self.innerContainer.backgroundColor = [UIColor clearColor];
self.innerContainer.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[self addSubview:self.innerContainer];
seted = YES;
}
- (void)reloadView
{
[self.innerContainer.layer removeAnimationForKey:@"move"];
for (UIView *sub in self.innerContainer.subviews) {
if ([sub isKindOfClass:[UILabel class]]) {
[sub removeFromSuperview];
}
}
CGFloat width = [self evaluateContentWidth];
moveNeed = width > self.bounds.size.width;
CGRect f = CGRectMake(0, 0, width, self.bounds.size.height);
UILabel *label = [[UILabel alloc] initWithFrame:f];
label.backgroundColor = [UIColor clearColor];
if (self.text) {
label.text = self.text;
label.textColor = self.textColor;
label.font = self.font;
} else {
label.attributedText = self.attributedText;
}
[self.innerContainer addSubview:label];
if (moveNeed) {
CGRect f1 = CGRectMake(width + self.leastInnerGap, 0, width, f.size.height);
UILabel *next = [[UILabel alloc] initWithFrame:f1];
next.backgroundColor = [UIColor clearColor];
if (self.text) {
next.text = self.text;
next.textColor = self.textColor;
next.font = self.font;
} else {
next.attributedText = self.attributedText;
}
[self.innerContainer addSubview:next];
CAKeyframeAnimation *moveAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform.translation.x"];
moveAnimation.keyTimes = @[@0., @0.191, @0.868, @1.0];
moveAnimation.duration = width / rate;
moveAnimation.values = @[@0, @0., @(- width - self.leastInnerGap)];
moveAnimation.repeatCount = self.repeatCount == 0 ? INT16_MAX : self.repeatCount;
moveAnimation.timingFunction = [CAMediaTimingFunction functionWithName:@"linear"];
[self.innerContainer.layer addAnimation:moveAnimation forKey:@"move"];
}
}
- (CGFloat)evaluateContentWidth
{
CGFloat width = 0.f;
NSStringDrawingOptions options = NSStringDrawingTruncatesLastVisibleLine |
NSStringDrawingUsesLineFragmentOrigin |
NSStringDrawingUsesFontLeading;
if (_text.length > 0) {
NSDictionary *attr = @{NSFontAttributeName : self.font};
CGSize size = [_text boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, self.bounds.size.height) options:options attributes:attr context:nil].size;
width = size.width;
} else if (_attributedText.length > 0) {
CGSize size = [_attributedText boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, self.bounds.size.height) options:options context:nil].size;
width = size.width;
}
return width;
}
@end
.m文件
for (int i = 0; i < 5; i++) {
//利用循环从下至上添加5个lable
CGRect rect = CGRectMake(100, 450 - i * 105, 180, 100);
BBFlashCtntLabel *lbl = [[BBFlashCtntLabel alloc] initWithFrame:rect];
//设置文本框的背景颜色
lbl.backgroundColor = [UIColor lightGrayColor];
// lbl.leastInnerGap = 50.f;
//对第三个文本框进行设置
if (i % 3 == 0) {
//设置播放次数
lbl.repeatCount = 5;
//设置播放速度为 慢
lbl.speed = BBFlashCtntSpeedSlow;
}
else if (i % 3 == 1) {
//设置第一 跟第四个文本框的播放速度为 中
lbl.speed = BBFlashCtntSpeedMild;
}
else {
//设置播放速度为 快
lbl.speed = BBFlashCtntSpeedFast;
}
NSString *str = @"测试文字。来来;‘了哈哈😄^_^abcdefg123456👿";
if (i %2 == 0) {
lbl.text = str;
lbl.font = [UIFont systemFontOfSize:25];
lbl.textColor = [UIColor whiteColor];
} else {
NSMutableAttributedString *att = [[NSMutableAttributedString alloc] initWithString:str];
//根据索引值改变文字的大小
[att addAttribute:NSFontAttributeName
value:[UIFont systemFontOfSize:25]
range:NSMakeRange(0, 5)];
[att addAttribute:NSFontAttributeName
value:[UIFont systemFontOfSize:17]
range:NSMakeRange(15, 5)];
//根据索引值给文字添加背景颜色
[att addAttribute:NSBackgroundColorAttributeName
value:[UIColor blueColor]
range:NSMakeRange(0, 15)];
//给文字添加颜色
[att addAttribute:NSForegroundColorAttributeName
value:[UIColor redColor]
range:NSMakeRange(8, 7)];
lbl.attributedText = att;
}
if (i == 0) {
lbl.textColor = [UIColor greenColor];
lbl.text = @"少量文字";
}
[self.view addSubview:lbl];
}}