最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS實(shí)現(xiàn)滾動(dòng)字幕的動(dòng)畫特效

 更新時(shí)間:2016年09月08日 14:49:57   作者:小明大神  
這篇文章給大家?guī)硪豢顟?yīng)用非常實(shí)用的控件,滾動(dòng)字幕,可以應(yīng)用在新聞、財(cái)經(jīng)、聊天等各類APP上,B格瞬間提升了一個(gè)檔次有木有,下面跟著小編一起看看如何實(shí)現(xiàn)的吧。

效果圖

開始上代碼

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

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

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

//滾動(dòng)字幕數(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;

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

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

#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ù)組是否存有對(duì)應(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)建一個(gè)label在contenSize上加上一個(gè)label的寬度
 self.contentSize=CGSizeMake(self.contentSize.width+labelW, self.bounds.size.height);

 [self addSubview:labelBackGroundView];
 [self addSubview:textLabel];

 }
 }

}

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

小tips:定時(shí)器是可以暫停的

NSTimer 系統(tǒng)是沒有提供暫停的方法的,方法列表中只提供了-fire(啟動(dòng)) 和 -invalidate(廢除)兩個(gè)方法,invalidate后是完全廢除不可再重啟

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

 //立即啟動(dòng)定時(shí)器
 [timer setFireDate:[NSDate date]];

//暫停定時(shí)器
 [timer setFireDate:[NSDate distantFuture]];

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

//************自動(dòng)滾動(dòng)timer************
 NSTimer *timer=[NSTimer scheduledTimerWithTimeInterval:SCROLL_TIME_INTERVAL target:self selector:@selector(autoScroll) userInfo:nil repeats:YES];

 [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

 //立即啟動(dòng)定時(shí)器
 [timer setFireDate:[NSDate date]];

 self.timer=timer;

這里是定時(shí)器驅(qū)動(dòng)scrollView滾動(dòng)的方法

這里注意了如果要達(dá)到字幕連續(xù)滾動(dòng)不斷幀的效果的話,timer調(diào)用需要非常頻繁(1秒調(diào)用10次以上),此時(shí)再看看CPU使用率.瞬間飆升了20%左右,雖然還在能接受的范圍,但在這種小地方耗費(fèi)CPU顯然不劃算

解決方法:給個(gè)動(dòng)畫過渡就好了嘛,UIView animateWithDuration輕松應(yīng)付,過渡很流暢,世界也瞬間安靜了。

后遺癥:用動(dòng)畫過渡唯一的問題就是,控制器跳轉(zhuǎn)后再回來的話,動(dòng)畫會(huì)直接結(jié)束跳到尾幀,細(xì)心的用戶會(huì)發(fā)覺這奇怪的地方,這就只有在性能和效果之間調(diào)和一下取最優(yōu)解了

//滾動(dòng)時(shí)間間隔
#define SCROLL_TIME_INTERVAL 3

//每次滾動(dòng)距離
#define SCROLL_DISTANCE 100
//自動(dòng)滾動(dòng)
- (void)autoScroll{

 //滾動(dòng)速度
 CGFloat offSet=SCROLL_DISTANCE;

 //若果字幕滾動(dòng)到第二部分重復(fù)的部分則把偏移置0,設(shè)為第一部分,實(shí)現(xiàn)無限循環(huán)
 if (self.contentOffset.x>=self.contentSize.width / 2) {

 self.contentOffset=CGPointMake(0, 0);
 }

 //切割每次動(dòng)畫滾動(dòng)距離

 [UIView animateWithDuration:SCROLL_TIME_INTERVAL delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
  self.contentOffset=CGPointMake(self.contentOffset.x+offSet, self.contentOffset.y);
 } completion:nil];
}

總結(jié)

好了,以上就是這篇文章的全部?jī)?nèi)容了,親們有什么意見和問題記得及時(shí)反饋哦,希望這篇文章的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作帶來一定的幫助。

相關(guān)文章

  • iOS獲取當(dāng)前app的設(shè)備名稱和版本號(hào)等內(nèi)容

    iOS獲取當(dāng)前app的設(shè)備名稱和版本號(hào)等內(nèi)容

    本文主要介紹了iOS獲取當(dāng)前app的設(shè)備名稱和版本號(hào)等內(nèi)容的方法。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-03-03
  • iOS使用UIScorllView實(shí)現(xiàn)兩指縮放功能

    iOS使用UIScorllView實(shí)現(xiàn)兩指縮放功能

    兩指縮放功能不僅可以用UIPinchGestureRecognizer手勢(shì)來實(shí)現(xiàn),還能用UIScorllView來實(shí)現(xiàn),UIScrollView可以輕松的實(shí)現(xiàn)最大與最小縮放值,以及滾動(dòng)的效果,效果非常棒,具體實(shí)例代碼大家參考下本文吧
    2017-03-03
  • iOS之基于FreeStreamer的簡(jiǎn)單音樂播放器示例

    iOS之基于FreeStreamer的簡(jiǎn)單音樂播放器示例

    這篇文章主要介紹了iOS之基于FreeStreamer的簡(jiǎn)單音樂播放器示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • iOS圖片壓縮、濾鏡、剪切及渲染等詳解

    iOS圖片壓縮、濾鏡、剪切及渲染等詳解

    這篇文章主要給大家介紹了關(guān)于iOS圖片壓縮、濾鏡、剪切及渲染等的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • iOS自定義UIDatePicker日期選擇器視圖

    iOS自定義UIDatePicker日期選擇器視圖

    這篇文章主要為大家詳細(xì)介紹了iOS自定義UIDatePicker日期選擇器視圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • IOS 獲取網(wǎng)絡(luò)圖片大小實(shí)例詳解

    IOS 獲取網(wǎng)絡(luò)圖片大小實(shí)例詳解

    這篇文章主要介紹了IOS 獲取網(wǎng)絡(luò)圖片大小實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • iOS二維碼的生成和掃描

    iOS二維碼的生成和掃描

    這篇文章主要為大家詳細(xì)介紹了iOS二維碼生成和掃描的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • iOS內(nèi)存錯(cuò)誤EXC_BAD_ACCESS的解決方法

    iOS內(nèi)存錯(cuò)誤EXC_BAD_ACCESS的解決方法

    iOS開發(fā),最郁悶的莫過于程序毫無征兆地就崩潰了,用bt命令打出調(diào)用棧,給出的是一堆系統(tǒng)EXC_BAD_ACCESS的信息,根本沒辦法定位問題出現(xiàn)在哪里
    2013-06-06
  • iOS 縮小打包項(xiàng)目ipa大小的實(shí)現(xiàn)方法

    iOS 縮小打包項(xiàng)目ipa大小的實(shí)現(xiàn)方法

    下面小編就為大家分享一篇iOS 縮小打包項(xiàng)目ipa大小的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • 更新了Xcode8 及 iOS10遇到的問題小結(jié)

    更新了Xcode8 及 iOS10遇到的問題小結(jié)

    更新了Xcode8 以及 iOS10,App訪問用戶的相機(jī)、相冊(cè)、麥克風(fēng)、通訊錄的權(quán)限都需要重新進(jìn)行相關(guān)的配置,不然在Xcode8中打開編譯的話會(huì)直接crash.這篇文章主要介紹了更新了Xcode8 及 iOS10遇到的問題小結(jié)的相關(guān)資料,需要的朋友可以參考下
    2016-09-09

最新評(píng)論

玉门市| 龙泉市| 江山市| 馆陶县| 辽宁省| 大同市| 精河县| 宝兴县| 景洪市| 富宁县| 外汇| 山东省| 开远市| 平罗县| 阿拉善左旗| 城固县| 皋兰县| 施甸县| 仙桃市| 汶川县| 仙居县| 长治市| 泸西县| 云和县| 夏河县| 甘泉县| 长泰县| 玉屏| 昌平区| 甘孜县| 拜泉县| 越西县| 龙井市| 阿荣旗| 金沙县| 南城县| 平陆县| 吴川市| 登封市| 莱阳市| 探索|