UIKit框架(二十) —— 基于UILabel跑馬燈類似效果的實現(xiàn)(一)

版本記錄

版本號 時間
V1.0 2019.05.18 星期六

前言

iOS中有關視圖控件用戶能看到的都在UIKit框架里面屠阻,用戶交互也是通過UIKit進行的。感興趣的參考上面幾篇文章策菜。
1. UIKit框架(一) —— UIKit動力學和移動效果(一)
2. UIKit框架(二) —— UIKit動力學和移動效果(二)
3. UIKit框架(三) —— UICollectionViewCell的擴張效果的實現(xiàn)(一)
4. UIKit框架(四) —— UICollectionViewCell的擴張效果的實現(xiàn)(二)
5. UIKit框架(五) —— 自定義控件:可重復使用的滑塊(一)
6. UIKit框架(六) —— 自定義控件:可重復使用的滑塊(二)
7. UIKit框架(七) —— 動態(tài)尺寸UITableViewCell的實現(xiàn)(一)
8. UIKit框架(八) —— 動態(tài)尺寸UITableViewCell的實現(xiàn)(二)
9. UIKit框架(九) —— UICollectionView的數(shù)據(jù)異步預加載(一)
10. UIKit框架(十) —— UICollectionView的數(shù)據(jù)異步預加載(二)
11. UIKit框架(十一) —— UICollectionView的重用晶疼、選擇和重排序(一)
12. UIKit框架(十二) —— UICollectionView的重用、選擇和重排序(二)
13. UIKit框架(十三) —— 如何創(chuàng)建自己的側滑式面板導航(一)
14. UIKit框架(十四) —— 如何創(chuàng)建自己的側滑式面板導航(二)
15. UIKit框架(十五) —— 基于自定義UICollectionViewLayout布局的簡單示例(一)
16. UIKit框架(十六) —— 基于自定義UICollectionViewLayout布局的簡單示例(二)
17. UIKit框架(十七) —— 基于自定義UICollectionViewLayout布局的簡單示例(三)
18. UIKit框架(十八) —— 基于CALayer屬性的一種3D邊欄動畫的實現(xiàn)(一)
19. UIKit框架(十九) —— 基于CALayer屬性的一種3D邊欄動畫的實現(xiàn)(二)

需求說明

在APP中我們一般用UILabel控件展示文字又憨,由于手機物理設備尺寸的限制翠霍,很多時候文字卻很長,而控件的寬度是固定或者有限的蠢莺,所以就會有一個場景那就是類似跑馬燈似的顯示文字寒匙,本篇就是這樣的一個Demo,首先看一下運行起來的效果。


需求實現(xiàn)

下面我們就該需求的實現(xiàn)锄弱,首先看下sb中的內容

先看一下UILabel的父視圖容器的約束

下面看一下文字控件UILabel的展示

主要就是這兩個控件考蕾,再沒有其他的控件了。

接下來会宪,主要就是代碼了肖卧。

1. ViewController.m
#import "ViewController.h"

#define KScreenWidth [[UIScreen mainScreen] bounds].size.width
#define testContainerLeadingMargin 40.0
#define testContainerHeight 30.0

NSString * const kGiftLabelContentAnimationKey = @"kGiftLabelContentAnimationKey";
NSString * const kGiftLabelMoveAnimationKey = @"kGiftLabelMoveAnimationKey";

@interface ViewController () <CAAnimationDelegate>

@property (weak, nonatomic) IBOutlet UILabel *testLabel;
@property (weak, nonatomic) IBOutlet UIView *testLabelContainerView;
@property (nonatomic, assign) BOOL giftDescDirection; //禮物文字動畫出來的方向  0表示右邊  1表示左邊//禮物總時長
@property (nonatomic, assign) CGFloat animationDuration; //禮物總時長
@property (nonatomic, strong) CAAnimationGroup *giftLabelMoveInOutAnim;
@property (nonatomic, strong) CABasicAnimation *giftLabelContentAnimation;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *labelLeadingConstraint;

@end

@implementation ViewController

#pragma mark -  Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.animationDuration = 6;
    
    self.testLabel.text = @"跑馬燈跑這個是新的空間上你號后手守護搜這個可以顯示出來嗎護手霜破售后收獲禮物文字動畫出來";
    
    self.testLabelContainerView.clipsToBounds = YES;
    
    CGSize mSize = [self.testLabel sizeThatFits:CGSizeMake(MAXFLOAT, testContainerHeight)];
    self.testLabel.frame = CGRectMake(0, 0, mSize.width + 5 + testContainerLeadingMargin * 2, testContainerHeight);
    self.testLabelContainerView.frame = CGRectMake(0, 0, MIN(mSize.width + 5 + testContainerLeadingMargin * 2, KScreenWidth * 0.9), testContainerHeight);
    
    CGSize labelSize = self.testLabel.frame.size;
    
    [self doGiftLabelMoveInOutAnimationWithSize:labelSize];
    self.giftLabelMoveInOutAnim.delegate = self;
    [self.testLabelContainerView.layer addAnimation:self.giftLabelMoveInOutAnim forKey:kGiftLabelMoveAnimationKey];

    
    [self doGiftLabelContentAnimationWithSize:labelSize];
    self.giftLabelContentAnimation.delegate = self;
    [self.testLabel.layer addAnimation:self.giftLabelContentAnimation forKey:kGiftLabelContentAnimationKey];
}

#pragma mark -  Object Private Function

- (CABasicAnimation *)doGiftLabelContentAnimationWithSize:(CGSize)mSize
{
    CABasicAnimation *contentAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
    contentAnimation.fromValue = [NSValue valueWithCGPoint:CGPointMake(mSize.width / 2, mSize.height / 2)];
    CGFloat offsetX = MIN(KScreenWidth * 0.9 - mSize.width, 0);
    contentAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(mSize.width / 2 + offsetX, mSize.height / 2)];
    contentAnimation.beginTime = CACurrentMediaTime() + .5f;
    contentAnimation.duration = 3.f;
    contentAnimation.removedOnCompletion = NO;
    contentAnimation.fillMode = kCAFillModeForwards;
    self.giftLabelContentAnimation = contentAnimation;
    return contentAnimation;
}

- (void)doGiftLabelMoveInOutAnimationWithSize:(CGSize)mSize
{
    float beiginHeight = 0;
    
    if ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) {
        beiginHeight = 104;
    }else{
        beiginHeight = 82;
    }
    
    // 平移動畫
    CABasicAnimation *moveIn  = [CABasicAnimation animationWithKeyPath:@"position"];
    //右邊進入
    if (self.giftDescDirection == 0) {
        moveIn.fromValue =  [NSValue valueWithCGPoint: CGPointMake(KScreenWidth+mSize.width/2, beiginHeight)];
    }else{
        moveIn.fromValue =  [NSValue valueWithCGPoint: CGPointMake(-mSize.width/2, beiginHeight)];
    }
    
    moveIn.toValue = [NSValue valueWithCGPoint: CGPointMake(KScreenWidth/2, beiginHeight)];
    moveIn.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
    moveIn.duration = 0.5;
    moveIn.removedOnCompletion = NO;
    moveIn.fillMode = kCAFillModeForwards;
    
    // 平移動畫
    CABasicAnimation *moveOut = [CABasicAnimation animationWithKeyPath:@"position"];
    if (self.giftDescDirection == 0) {
        moveOut.toValue = [NSValue valueWithCGPoint: CGPointMake(-mSize.width/2, beiginHeight)];
    }else{
        moveOut.toValue = [NSValue valueWithCGPoint: CGPointMake(KScreenWidth+mSize.width/2, beiginHeight)];
    }
    moveOut.beginTime = self.animationDuration-0.5;
    moveOut.duration = 0.5f; //動畫時長
    moveOut.removedOnCompletion = NO;
    moveOut.fillMode = kCAFillModeForwards;
    moveOut.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
    
    // 進入進出組動畫
    self.giftLabelMoveInOutAnim = [CAAnimationGroup animation];
    self.giftLabelMoveInOutAnim.animations = @[moveIn,moveOut];
    self.giftLabelMoveInOutAnim.duration = self.animationDuration;
    self.giftLabelMoveInOutAnim.fillMode = kCAFillModeForwards;
    self.giftLabelMoveInOutAnim.removedOnCompletion = NO;
}

#pragma mark -  CAAnimationDelegate

- (void)animationDidStart:(CAAnimation *)anim
{
    NSLog(@"animationDidStart");
}

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
    NSLog(@"animationDidStop");
}

@end

這個效果其實還是很好實現(xiàn)的,類似跑馬燈一樣跑了一次掸鹅,如果大家想要一直循環(huán)跑的效果塞帐,后期我可以擴展,加上那種效果的實現(xiàn)巍沙。

后記

本篇主要講述了基于UILabel跑馬燈類似效果的實現(xiàn)葵姥,感興趣的給個贊或者關注~~~

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市句携,隨后出現(xiàn)的幾起案子榔幸,更是在濱河造成了極大的恐慌,老刑警劉巖务甥,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牡辽,死亡現(xiàn)場離奇詭異,居然都是意外死亡敞临,警方通過查閱死者的電腦和手機态辛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挺尿,“玉大人奏黑,你說我怎么就攤上這事”喾” “怎么了熟史?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長窄俏。 經(jīng)常有香客問我蹂匹,道長,這世上最難降的妖魔是什么凹蜈? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任限寞,我火速辦了婚禮,結果婚禮上仰坦,老公的妹妹穿的比我還像新娘履植。我一直安慰自己,他們只是感情好悄晃,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布玫霎。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪庶近。 梳的紋絲不亂的頭發(fā)上翁脆,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音拦盹,去河邊找鬼鹃祖。 笑死,一個胖子當著我的面吹牛普舆,可吹牛的內容都是我干的恬口。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼沼侣,長吁一口氣:“原來是場噩夢啊……” “哼祖能!你這毒婦竟也來了?” 一聲冷哼從身側響起蛾洛,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤养铸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后轧膘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钞螟,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年谎碍,在試婚紗的時候發(fā)現(xiàn)自己被綠了鳞滨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡蟆淀,死狀恐怖拯啦,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情熔任,我是刑警寧澤褒链,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站疑苔,受9級特大地震影響甫匹,放射性物質發(fā)生泄漏。R本人自食惡果不足惜惦费,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一赛惩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧趁餐,春花似錦、人聲如沸篮绰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至臀突,卻和暖如春勉抓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背候学。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工藕筋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人梳码。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓隐圾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掰茶。 傳聞我的和親對象是個殘疾皇子暇藏,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內容