你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS完成轉動字幕的動畫殊效

iOS完成轉動字幕的動畫殊效

編輯:IOS開發綜合

後果圖

開端上代碼

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

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved