後果圖

開端上代碼
轉動字幕的道理是用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完成轉動字幕的動畫殊效】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!