iOS黑科技【動畫特效篇-3】 滾動字幕--ScrollCanvas

iOS黑科技【動畫特效篇】第三期

這一期帶來一款應(yīng)用非常實(shí)用的控件扛芽,滾動字幕擒滑,可以應(yīng)用在新聞腐晾、財經(jīng)、聊天等各類APP上丐一,B格瞬間提升了一個檔次有木有

scrollCanvas.gif

話不多說藻糖,github走一波,已封裝可直接只用库车,留有一個便捷初始方法及各種屬性接口
https://github.com/XMDashen/XMScrollCanvas.git
順便給個星哦愤估!(*  ̄3)(ε ̄ *)

開始上代碼

滾動字幕的原理是用timer定時器間隔一定的時間來驅(qū)動scrollView上的內(nèi)容偏移寒随,來實(shí)現(xiàn)滾動的效果狮含,原理比較簡單剩晴,關(guān)鍵是有些細(xì)節(jié)需要處理好,實(shí)現(xiàn)流暢效果的同時要考慮到性能優(yōu)化

這里是.h文件的接口方法及屬性珍坊,可適應(yīng)大部分自定義場景

/*初始化*/
-(instancetype)initWithFrame:(CGRect)frame textArray:(NSArray *)textArray colorArray:(NSArray *)textColorArray;

//滾動字幕數(shù)組
@property(nonatomic,strong) NSArray<NSString *> *textArray;

//字幕顏色數(shù)組
@property(nonatomic,strong) NSArray<UIColor *> *textColorArray;

//字幕背景顏色
@property(nonatomic,strong) UIColor *backgroundColorOfCanvas;

//標(biāo)簽背景圖片
@property(nonatomic,strong) UIImage *backgroundImageOfCanvas;

//字體大小
@property(nonatomic,assign) CGFloat fontOfSize;

//定時器
@property(nonatomic,strong) NSTimer *timer;

實(shí)現(xiàn)滾動字幕的思路和無限輪播圖相似牺勾,這里用了一點(diǎn)小技巧即可實(shí)現(xiàn)字幕的收尾連續(xù)相接:將同樣的字幕內(nèi)容復(fù)制一份拼接到后面就可以了,當(dāng)字幕的scrollView滾動到復(fù)制的那份內(nèi)容開頭時阵漏,將contentOffset偏移量設(shè)置到原始內(nèi)容的開頭禽最,這樣就可以實(shí)現(xiàn)無縫的連續(xù)循環(huán)滾動了O(∩_∩)O

#pragma mark - 創(chuàng)建scrollView內(nèi)容
-(void)createContentOfScrollView{
 
    //創(chuàng)建contentView
    self.contentSize=CGSizeMake(0, self.bounds.size.height);
    
    //偏移量初值設(shè)為0
    self.contentOffset=CGPointMake(0, 0);
    
    //關(guān)閉指示條
    self.showsHorizontalScrollIndicator=NO;
    
    //創(chuàng)建label

    CGFloat labelY=0;
    CGFloat labelW=200;
    CGFloat labelH=self.bounds.size.height;
    
    //添加兩次一樣的內(nèi)容腺怯,無限循環(huán)使用
    for (int j=0; j<2;j++ ) {
        
    for (int i=0; i<self.textArray.count; i++) {
           
        UILabel *textLabel=[[UILabel alloc] initWithFrame:CGRectMake(self.contentSize.width, labelY, labelW, labelH)];
        
        //******標(biāo)簽背景******
        UIImageView *labelBackGroundView=[[UIImageView alloc] initWithFrame:textLabel.frame];
        
        //標(biāo)簽背景圖片
        labelBackGroundView.image=self.backgroundImageOfCanvas;
        
        //*****label文字******
        if (i<self.textArray.count) {
            textLabel.text=self.textArray[i];
        }else{
            textLabel.text=@"----";
        }
        
        //label文字顏色(判斷文字顏色數(shù)組是否存有對應(yīng)的顏色,沒有則使用默認(rèn)顏色)
        if (i<self.textColorArray.count) {
            textLabel.textColor=self.textColorArray[i];
        }else{
            //默認(rèn)顏色
            textLabel.textColor=[UIColor blackColor];
        }
        
        //******字體大小********
        textLabel.font=[UIFont systemFontOfSize:self.fontOfSize];
        
        //label標(biāo)簽tag值
        textLabel.tag=LABEL_TAG_INIT + i + 100 * j;
        
        //每創(chuàng)建一個label在contenSize上加上一個label的寬度
        self.contentSize=CGSizeMake(self.contentSize.width+labelW, self.bounds.size.height);
        
        [self addSubview:labelBackGroundView];
        [self addSubview:textLabel];
        
    }
    }
    
}

這里注意定時器timer的使用川无,要將timer加入到runloop里呛占,注意是CommonModes,如果用defaultModes的話就會出現(xiàn)卡頓(與滑動等事件處于同一runLoop懦趋,系統(tǒng)會優(yōu)先響應(yīng)滑動)

小tips:定時器是可以暫停的
NSTimer 系統(tǒng)是沒有提供暫停的方法的晾虑,方法列表中只提供了-fire(啟動) 和 -invalidate(廢除)兩個方法,invalidate后是完全廢除不可再重啟

但是這里有個@property (copy) NSDate *fireDate的屬性仅叫,我們可以借助這個屬性來實(shí)現(xiàn)定時器的暫停和重啟

 //立即啟動定時器
 [timer setFireDate:[NSDate date]];

//暫停定時器
 [timer setFireDate:[NSDate distantFuture]];

是不是有種很奇妙的感覺帜篇,這里利用定時器的啟動時間屬性巧妙的達(dá)到了暫停和重啟的目的

//************自動滾動timer************
        NSTimer *timer=[NSTimer scheduledTimerWithTimeInterval:SCROLL_TIME_INTERVAL target:self selector:@selector(autoScroll) userInfo:nil repeats:YES];
        
        [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

        //立即啟動定時器
        [timer setFireDate:[NSDate date]];

        self.timer=timer;

這里是定時器驅(qū)動scrollView滾動的方法
這里注意了如果要達(dá)到字幕連續(xù)滾動不斷幀的效果的話,timer調(diào)用需要非常頻繁(1秒調(diào)用10次以上)诫咱,此時再看看CPU使用率(@ο@)..瞬間飆升了20%左右笙隙,雖然還在能接受的范圍,但在這種小地方耗費(fèi)CPU顯然不劃算
解決方法:給個動畫過渡就好了嘛坎缭,UIView animateWithDuration輕松應(yīng)付竟痰,過渡很流暢,世界也瞬間安靜了掏呼。
后遺癥:用動畫過渡唯一的問題就是坏快,控制器跳轉(zhuǎn)后再回來的話,動畫會直接結(jié)束跳到尾幀憎夷,細(xì)心的用戶會發(fā)覺這奇怪的地方莽鸿,這就只有在性能和效果之間調(diào)和一下取最優(yōu)解了

//滾動時間間隔
#define SCROLL_TIME_INTERVAL 3

//每次滾動距離
#define SCROLL_DISTANCE 100
//自動滾動
- (void)autoScroll{
    
    //滾動速度
    CGFloat offSet=SCROLL_DISTANCE;
    
    //若果字幕滾動到第二部分重復(fù)的部分則把偏移置0,設(shè)為第一部分,實(shí)現(xiàn)無限循環(huán)
    if (self.contentOffset.x>=self.contentSize.width / 2) {
        
        self.contentOffset=CGPointMake(0, 0);
    }
    
    //切割每次動畫滾動距離
    
    [UIView animateWithDuration:SCROLL_TIME_INTERVAL delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
                self.contentOffset=CGPointMake(self.contentOffset.x+offSet, self.contentOffset.y);
    } completion:nil];
}

這一期就到這里了拾给,親們有什么意見和問題記得及時反饋哦祥得,喜歡的話點(diǎn)個關(guān)注給個贊(づ ̄3 ̄)づ╭?~
我們下期再會

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蒋得,隨后出現(xiàn)的幾起案子级及,更是在濱河造成了極大的恐慌,老刑警劉巖窄锅,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缰雇,居然都是意外死亡入偷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進(jìn)店門械哟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疏之,“玉大人,你說我怎么就攤上這事暇咆》孀Γ” “怎么了丙曙?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長其骄。 經(jīng)常有香客問我亏镰,道長,這世上最難降的妖魔是什么拯爽? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任索抓,我火速辦了婚禮,結(jié)果婚禮上毯炮,老公的妹妹穿的比我還像新娘逼肯。我一直安慰自己,他們只是感情好桃煎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布篮幢。 她就那樣靜靜地躺著,像睡著了一般为迈。 火紅的嫁衣襯著肌膚如雪三椿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天曲尸,我揣著相機(jī)與錄音赋续,去河邊找鬼。 笑死另患,一個胖子當(dāng)著我的面吹牛纽乱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昆箕,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鸦列,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鹏倘?” 一聲冷哼從身側(cè)響起薯嗤,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纤泵,沒想到半個月后骆姐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捏题,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年玻褪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片公荧。...
    茶點(diǎn)故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡带射,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出循狰,到底是詐尸還是另有隱情窟社,我是刑警寧澤券勺,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站灿里,受9級特大地震影響关炼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钠四,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一盗扒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缀去,春花似錦侣灶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至咏雌,卻和暖如春凡怎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赊抖。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工统倒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人氛雪。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓房匆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親报亩。 傳聞我的和親對象是個殘疾皇子浴鸿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評論 2 355

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件弦追、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,105評論 4 62
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,158評論 25 707
  • 我剛才下載了兩個高考倒計時軟件岳链,在我的手機(jī)桌面上每個板塊都能清晰的看到剩余時間。還有301天劲件。 我是個相當(dāng)懶惰沒有...
    夏冬生閱讀 153評論 0 0
  • 今日分享一圖掸哑,原創(chuàng)小詩,僅供娛樂零远。 喜歡用文字來與內(nèi)心的自己交流苗分,以前沒有手機(jī)的時候,總會把筆記本寫滿遍烦。 可能是在...
    想要去非洲的夢想閱讀 215評論 0 1