滾動顯示Label優(yōu)化版本

.h

#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;        // 默認(rèn):system(15)

@property (nonatomic, strong) UIColor *textColor;

@property (nonatomic, strong) NSAttributedString *attributedText;

@property (nonatomic, assign) BBFlashCtntSpeed speed;

// 循環(huán)滾動次數(shù)(為0時無限滾動)

@property (nonatomic, assign) NSUInteger repeatCount;

@property (nonatomic, assign) CGFloat leastInnerGap;

- (void)reloadView;

@end

.m

#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.textAlignment = NSTextAlignmentCenter;

label.backgroundColor = [UIColor clearColor];

label.text = self.text;

label.textColor = self.textColor;

label.font = self.font;

[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];

next.textAlignment = NSTextAlignmentCenter;

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., @1.0];

moveAnimation.duration = width / rate;

moveAnimation.values = @[@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

在控制器中使用時:

BBFlashCtntLabel *label = [[BBFlashCtntLabel alloc]initWithFrame:CGRectMake(50, 100, 150, 50)];

label.text = @"大猴子小猴子,大小猴子,小大猴子,子猴大小,猴子小大";

label.textColor = [UIColor magentaColor];

label.speed = -1;

label.leastInnerGap = 10;

[self.view addSubview:label];

這樣就實(shí)現(xiàn)真正意義上的循環(huán)滾動顯示了.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漓糙,一起剝皮案震驚了整個濱河市员舵,隨后出現(xiàn)的幾起案子岛啸,更是在濱河造成了極大的恐慌变骡,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肢娘,死亡現(xiàn)場離奇詭異呈础,居然都是意外死亡舆驶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門而钞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沙廉,“玉大人,你說我怎么就攤上這事臼节∏肆辏” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵网缝,是天一觀的道長巨税。 經(jīng)常有香客問我,道長粉臊,這世上最難降的妖魔是什么草添? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮扼仲,結(jié)果婚禮上远寸,老公的妹妹穿的比我還像新娘。我一直安慰自己犀盟,他們只是感情好而晒,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布蝇狼。 她就那樣靜靜地躺著阅畴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪迅耘。 梳的紋絲不亂的頭發(fā)上贱枣,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機(jī)與錄音颤专,去河邊找鬼纽哥。 笑死,一個胖子當(dāng)著我的面吹牛栖秕,可吹牛的內(nèi)容都是我干的春塌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼簇捍,長吁一口氣:“原來是場噩夢啊……” “哼只壳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起暑塑,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吼句,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后事格,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惕艳,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搞隐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了远搪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劣纲。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谁鳍,靈堂內(nèi)的尸體忽然破棺而出味廊,到底是詐尸還是另有隱情,我是刑警寧澤棠耕,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布余佛,位于F島的核電站,受9級特大地震影響窍荧,放射性物質(zhì)發(fā)生泄漏辉巡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一蕊退、第九天 我趴在偏房一處隱蔽的房頂上張望郊楣。 院中可真熱鬧,春花似錦瓤荔、人聲如沸净蚤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽今瀑。三九已至,卻和暖如春点把,著一層夾襖步出監(jiān)牢的瞬間橘荠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工郎逃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哥童,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓褒翰,卻偏偏與公主長得像贮懈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子优训,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫朵你、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,121評論 4 61
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,304評論 25 707
  • runtime源碼下載地址http://opensource.apple.com/tarballs/objc4/ ...
    openlab閱讀 601評論 0 0
  • 美妙的時光一去不復(fù)返 讓我最懷念的還是 2016那年初二下學(xué)期 我遇見的那個他 正在操場做廣播體操的我向東北方望去...
    初愛Z閱讀 201評論 0 0
  • 很多時候,有些家長總認(rèn)為妆兑,孩子交到學(xué)校魂拦,交給老師毛仪,就是老師的責(zé)任,其實(shí)芯勘,無論多么好的老師箱靴,都替代不了父母的位置,教...
    happy歐小妞閱讀 480評論 0 1