後果圖
開端上代碼
轉動字幕的道理是用timer准時器距離必定的時光來驅動scrollView
上的內容偏移,來完成轉動的後果,道理比擬簡略,症結是有些細節須要處置好,完成流利後果的同時要斟酌到機能優化
這裡是.h文件的接口辦法及屬性,可順應年夜部門自界說場景
/*初始化*/ -(instancetype)initWithFrame:(CGRect)frame textArray:(NSArray *)textArray colorArray:(NSArray *)textColorArray; //轉動字幕數組 @property(nonatomic,strong) NSArray<NSString *> *textArray; //字幕色彩數組 @property(nonatomic,strong) NSArray<UIColor *> *textColorArray; //字幕配景色彩 @property(nonatomic,strong) UIColor *backgroundColorOfCanvas; //標簽配景圖片 @property(nonatomic,strong) UIImage *backgroundImageOfCanvas; //字體年夜小 @property(nonatomic,assign) CGFloat fontOfSize; //准時器 @property(nonatomic,strong) NSTimer *timer;
完成轉動字幕的思緒和無窮輪播圖類似,這裡用了一點小技能便可完成字幕的掃尾持續相接:將異樣的字幕內容復制一份拼接到前面便可以了,當字幕的scrollView
轉動到復制的那分內容開首時,將contentOffset
偏移量設置到原始內容的開首,如許便可以完成無縫的持續輪回轉動了
#pragma mark - 創立scrollView內容 -(void)createContentOfScrollView{ //創立contentView self.contentSize=CGSizeMake(0, self.bounds.size.height); //偏移量初值設為0 self.contentOffset=CGPointMake(0, 0); //封閉指導條 self.showsHorizontalScrollIndicator=NO; //創立label CGFloat labelY=0; CGFloat labelW=200; CGFloat labelH=self.bounds.size.height; //添加兩次一樣的內容,無窮輪回應用 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)]; //******標簽配景****** UIImageView *labelBackGroundView=[[UIImageView alloc] initWithFrame:textLabel.frame]; //標簽配景圖片 labelBackGroundView.image=self.backgroundImageOfCanvas; //*****label文字****** if (i<self.textArray.count) { textLabel.text=self.textArray[i]; }else{ textLabel.text=@"----"; } //label文字色彩(斷定文字色彩數組能否存有對應的色彩,沒有則應用默許色彩) if (i<self.textColorArray.count) { textLabel.textColor=self.textColorArray[i]; }else{ //默許色彩 textLabel.textColor=[UIColor blackColor]; } //******字體年夜小******** textLabel.font=[UIFont systemFontOfSize:self.fontOfSize]; //label標簽tag值 textLabel.tag=LABEL_TAG_INIT + i + 100 * j; //每創立一個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
的話就會湧現卡頓(與滑動等事宜處於統一runLoop
,體系會優先呼應滑動)
小tips:准時器是可以暫停的
NSTimer
體系是沒有供給暫停的辦法的,辦法列表中只供給了-fire
(啟動) 和 -invalidate
(破除)兩個辦法,invalidate
後是完整破除弗成再重啟
然則這裡有個@property (copy) NSDate *fireDate
的屬性,我們可以借助這個屬性來完成准時器的暫停和重啟
//立刻啟動准時器 [timer setFireDate:[NSDate date]]; //暫停准時器 [timer setFireDate:[NSDate distantFuture]];
是否是有種很奧妙的感到,這裡應用准時器的啟動時光屬性奇妙的到達了暫停和重啟的目標
//************主動轉動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;
這裡是准時器驅動scrollView
轉動的辦法
這裡留意了假如要到達字幕持續轉動赓續幀的後果的話,timer
挪用須要異常頻仍(1秒挪用10次以上),此時再看看CPU應用率.剎時飙升了20%閣下,固然還在能接收的規模,但在這類小處所消耗CPU明顯不劃算
處理辦法:給個動畫過渡就行了嘛,UIView animateWithDuration
輕松敷衍,過渡很流利,世界也剎時寧靜了。
後遺症:用動畫過渡獨一的成績就是,掌握器跳轉後再回來的話,動畫會直接停止跳到尾幀,仔細的用戶會覺察這奇異的處所,這就只要在機能和後果之間折衷一下取最優解了
//轉動時光距離 #define SCROLL_TIME_INTERVAL 3 //每次轉動間隔 #define SCROLL_DISTANCE 100
//主動轉動 - (void)autoScroll{ //轉動速度 CGFloat offSet=SCROLL_DISTANCE; //若果字幕轉動到第二部門反復的部門則把偏移置0,設為第一部門,完成無窮輪回 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]; }
總結
好了,以上就是這篇文章的全體內容了,親們有甚麼看法和成績記得實時反應哦,願望這篇文章的內容對年夜家的進修或許任務帶來必定的贊助。
【iOS完成轉動字幕的動畫殊效】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!