iOS文字輪播簡(jiǎn)單實(shí)現(xiàn)(UILabel)

因項(xiàng)目需求杆查,要做一個(gè)文字輪播用來展示一些通知內(nèi)容,以前也有過這個(gè)需求臀蛛,但之前都是在網(wǎng)上找的第三方亲桦,現(xiàn)在有點(diǎn)時(shí)間就自己寫了個(gè)簡(jiǎn)單的。

整體思路:用一個(gè)UILabel來展示內(nèi)容浊仆,通過UIView動(dòng)畫來實(shí)現(xiàn)滾動(dòng)效果客峭,通過控制其坐標(biāo)和隱藏狀態(tài)來修改其滾動(dòng)的起始位置。實(shí)現(xiàn)比較簡(jiǎn)單抡柿,活不多說舔琅,直接貼代碼了。

.h文件

#import <UIKit/UIKit.h>  
  
@protocol YMNoticeScrollViewDelegate  
  
@optional  
/// 點(diǎn)擊代理  
- (void)noticeScrollDidClickAtIndex:(NSInteger)index content:(NSString *)content;  
  
@end  
  
@interface YMNoticeScrollView : UIView  
  
@property (nonatomic, weak) id<YMNoticeScrollViewDelegate> delegate;  
  
/// 滾動(dòng)文字?jǐn)?shù)組  
@property (nonatomic, strong) NSArray *contents;  
  
/// 文字停留時(shí)長(zhǎng)洲劣,默認(rèn)4S  
@property (nonatomic, assign) NSTimeInterval timeInterval;  
  
/// 文字滾動(dòng)時(shí)長(zhǎng)备蚓,默認(rèn)0.3S  
@property (nonatomic, assign) NSTimeInterval scrollTimeInterval;  
@end  

.m文件

#import "YMNoticeScrollView.h"  
  
@implementation YMNoticeScrollView  
{  
    UILabel *_scrollLbl;  
    NSTimer *_timer;  
    NSUInteger _count;  
    CGFloat Width;  
    CGFloat Height;  
}  
- (instancetype)initWithFrame:(CGRect)frame {  
    if (self = [super initWithFrame:frame]) {  
        Width = frame.size.width;  
        Height = frame.size.height;  
        _timeInterval = 4;  
        _scrollTimeInterval = 0.3;  
        [self initSubViews];  
    }  
    return self;  
}  
  
/// 創(chuàng)建Label  
- (void)initSubViews {  
    self.clipsToBounds = YES;  
      
    _scrollLbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, Width, Height)];  
    _scrollLbl.textColor = TEXT_COLOR_LEVEL_2;  
    _scrollLbl.font = SystemFont(12);  
    _scrollLbl.numberOfLines = 2;  
    _scrollLbl.userInteractionEnabled = YES;  
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(clickAction)];  
    [_scrollLbl addGestureRecognizer:tap];  
    [self addSubview:_scrollLbl];  
}  
// 開啟定時(shí)器  
- (void)startTimer {  
    if (!_timer) {  
        _timer = [NSTimer timerWithTimeInterval:_timeInterval target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];  
        [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];  
    }  
}  
  
/// 定時(shí)器方法  
- (void)timerMethod {  
    _count++;  
    if (_count == _contents.count) {  
        _count = 0;  
    }  
    /// 兩次動(dòng)畫實(shí)現(xiàn)類似UIScrollView的滾動(dòng)效果,控制坐標(biāo)和隱藏狀態(tài)  
    [UIView animateWithDuration:_scrollTimeInterval animations:^{  
        _scrollLbl.frame = CGRectMake(0, -Height, Width, Height);  
    } completion:^(BOOL finished) {  
        _scrollLbl.hidden = YES;  
        _scrollLbl.frame = CGRectMake(0, Height, Width, Height);  
        _scrollLbl.hidden = NO;  
        [UIView animateWithDuration:_scrollTimeInterval animations:^{  
            _scrollLbl.text = [self getCurrentContent];  
            _scrollLbl.frame = CGRectMake(0, 0, Width, Height);  
        } completion:^(BOOL finished) {  
              
        }];  
    }];  
}  
/// 獲取要展示的內(nèi)容數(shù)組  
- (void)setContents:(NSArray *)contents {  
    // 判斷是否要重新賦值  
    if ([self array:contents isEqualTo:_contents]) {  
          
        return;  
    }  
    _contents = contents;  
    [self reset];  
    if (!contents || contents.count == 0) {  
        return;  
    }  
    [self startTimer];  
}  
  
/// 重置初始狀態(tài)  
- (void)reset {  
      
    _count = 0;  
    _scrollLbl.frame = CGRectMake(0, 0, Width, Height);  
    _scrollLbl.text = [self getCurrentContent];  
    [_timer invalidate];  
    _timer = nil;  
}  
/// 獲取當(dāng)前要展示的內(nèi)容  
- (NSString *)getCurrentContent {  
    if (!_contents || _contents.count == 0) {  
        return nil;  
    }  
    return _contents[_count];  
}  
/// 比較兩個(gè)數(shù)組內(nèi)容是否相同  
- (BOOL)array:(NSArray *)array1 isEqualTo:(NSArray *)array2 {  
    if (array1.count != array2.count) {  
        return NO;  
    }  
    for (NSString *str in array1) {  
        if (![array2 containsObject:str]) {  
            return NO;  
        }  
    }  
    return YES;  
}  
/// 點(diǎn)擊事件  
- (void)clickAction {  
      
    if (_delegate && [(id)_delegate respondsToSelector:@selector(noticeScrollDidClickAtIndex:content:)]) {  
        [_delegate noticeScrollDidClickAtIndex:_count content:_contents[_count]];  
    }  
}  

如果各位大神發(fā)現(xiàn)什么問題囱稽,還望指正郊尝。
轉(zhuǎn)載請(qǐng)注明原文鏈接:http://www.reibang.com/p/6e67c879282a

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市战惊,隨后出現(xiàn)的幾起案子虚循,更是在濱河造成了極大的恐慌,老刑警劉巖样傍,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異铺遂,居然都是意外死亡衫哥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門襟锐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撤逢,“玉大人,你說我怎么就攤上這事∥萌伲” “怎么了初狰?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)互例。 經(jīng)常有香客問我奢入,道長(zhǎng),這世上最難降的妖魔是什么媳叨? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任腥光,我火速辦了婚禮,結(jié)果婚禮上糊秆,老公的妹妹穿的比我還像新娘武福。我一直安慰自己,他們只是感情好痘番,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布捉片。 她就那樣靜靜地躺著,像睡著了一般汞舱。 火紅的嫁衣襯著肌膚如雪伍纫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天兵拢,我揣著相機(jī)與錄音翻斟,去河邊找鬼。 笑死说铃,一個(gè)胖子當(dāng)著我的面吹牛访惜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播腻扇,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼债热,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了幼苛?” 一聲冷哼從身側(cè)響起窒篱,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舶沿,沒想到半個(gè)月后墙杯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡括荡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年高镐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畸冲。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嫉髓,死狀恐怖观腊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情算行,我是刑警寧澤梧油,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站州邢,受9級(jí)特大地震影響儡陨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜偷霉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一迄委、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧类少,春花似錦叙身、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至残吩,卻和暖如春财忽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背泣侮。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工即彪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人活尊。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓隶校,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蛹锰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子深胳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件铜犬、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,059評(píng)論 4 62
  • 多刺激幾次就會(huì)習(xí)慣成自然 有腦子并不是好事 多思多想常焦慮 需要多接受刺激 去不斷擴(kuò)大你的認(rèn)知 認(rèn)知發(fā)生改變 思維...
    烏鴉少年87閱讀 308評(píng)論 0 0
  • @font-face是CSS3中的一個(gè)模塊舞终,他主要是把自己定義的web字體嵌入到你的網(wǎng)頁中1、@font-face...
    MakingChoice閱讀 1,168評(píng)論 0 1
  • 距離春節(jié)越來越近了夸盟, 回家的票都買了嗎? 如果你春節(jié)回家選擇高鐵或者飛機(jī)呐粘, 這幾個(gè)小妙招你一定要看满俗。 高 鐵 1想...
    旅途印記閱讀 247評(píng)論 0 0
  • 這事情是真的唆垃,就發(fā)生在不久前,我不騙你痘儡。 是的辕万,我有什么必要騙你呢?何況我還巴不到不讓你知道呢沉删。想騙你也不可能渐尿,因...
    Mr_稻香老農(nóng)閱讀 1,028評(píng)論 89 71