Nice標簽動畫分析


layout: post
title: "Nice 標簽動畫分析"
date: 2015-04-05 16:51:25 +0800
comments: true
categories: iOS 動畫


Demo動畫
Demo動畫

上圖是模仿nice中的標簽,接下來分析構建這個控件的過程煤辨。

開始需要看下iOS的顯示動畫 以及 CAAnimationGroup

1. 中間icon的放大縮小動畫

首先給layer設置image icon永部,

layer.contents = (__bridge id)(icon.CGImage);

通過 “transform.scale”這個keypath 來收縮layer,縮放過程如下:
1 縮小到0.8倍
2 放大到1.2倍
3 復原到1.0倍

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
    animation.fromValue = @1;
    animation.toValue = @0.8;
    animation.duration = 0.2;

    CABasicAnimation *animation1 = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
    animation1.fromValue = @0.8;
    animation1.toValue = @1.2;
    animation1.duration = 0.4;
    animation1.beginTime = animation.duration;
    
    CABasicAnimation *animation2 = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
    animation2.fromValue = @1.2;
    animation2.toValue = @1;
    animation2.duration = 0.2;
    animation2.beginTime = animation.duration + animation1.duration;

    CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
    animationGroup.duration = animation.duration + animation1.duration + animation2.duration + 0.1;
    animationGroup.repeatCount = 0;
    animationGroup.delegate = self;
    animationGroup.animations = @[animation,animation1,animation2];
    [animationGroup setValue:@"icon" forKey:@"animationName"];
        ``` 
CAAnimationGroup中的動畫都是并發(fā)執(zhí)行的毙替,所以icon動畫關鍵是通過beginTime設置每個動畫開始播放的時間墨榄,repeatCount=0,所有動畫都為單次播放。
## 2. 脈沖動畫
```objc
    CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
    animation3.fromValue = @0.0;
    animation3.toValue = @1.0;
    animation3.duration = duration;
    //關鍵幀動畫
    CAKeyframeAnimation *opacityAnimation = [CAKeyframeAnimation animationWithKeyPath:@"opacity"];
    animation4.duration =duration ;
    animation4.values = @[@0.8, @0.45, @0];
    animation4.keyTimes = @[@0, @0.2, @1];
    
        CAAnimationGroup *animationGroup = [CAAnimationGroup animation];        
    .......
     [animationGroup setValue:@"pulse" forKey:@"animationName"];

    ```
通過CAAnimationGroup來實現(xiàn)layer一邊放大,一邊設置透明度來實現(xiàn)脈沖效果只怎,
## 3. 通過Animation的delegate來組合動畫
看圖是整個動畫是由 一個收縮動畫 兩個脈沖動畫組合起來的,組合過程就是由各個CAAnimationGroup的delegate來合成的
 
 ```objc
   - (void)animationDidStart:(CAAnimation *)animation{        //等第一個脈沖動畫播放到0.5秒怜俐,開始播放第二個動畫
        NSString *animationName = [animation valueForKey:@"animationName"];
        if ([animationName  isEqualToString:@"pulse"]) {
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * self.pulsingGroup.duration  * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                [pulsingLayer1 addAnimation:pulsingGroup1 forKey:@"pulse1"];
            });
        }
  }
    - (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)finished{
        NSString *animationName = [animation valueForKey:@"animationName"];
        if ([animationName isEqualToString:@"icon"]) { //icon動畫播放完結束后添加脈沖動畫
            [imageLayer removeAnimationForKey:@"icon"];
            [pulsingLayer addAnimation:pulsingGroup forKey:@"pulse"];
        }else if ([animationName isEqualToString:@"pulse"]){ //第一個脈沖動畫播放完成后移除
            [pulsingLayer removeAnimationForKey:@"pulse"];
        }else if ([animationName isEqualToString:@"pulse1"]){//第二個脈沖動畫播放后身堡,再開始循環(huán)播放icon動畫
            [pulsingLayer1 removeAnimationForKey:@"pulse1"];
            [imageLayer addAnimation:iconGroup forKey:@"icon"];
        }
}

4. 繪制箭頭

首先計算tag上文字的寬度加上 除去文字的其他寬度,算出tag的寬度佑菩, 然后找到這個箭頭的5個角盾沫, 通過addArcWithCenter 這個方法 (在每個角上畫上一個圓,確定每個圓的半徑殿漠、圓心以及角度赴精。) 分別在5個角上畫5段弧線。然后 使用 [path fill]來填充背景顏色绞幌。

5. 繪制文字

NSDictionary *attributes = @{
                                   NSShadowAttributeName : shadow,
                                   NSForegroundColorAttributeName : [UIColor colorWithRed:255 green:255 blue:255 alpha:1],
                                   NSFontAttributeName : [UIFont systemFontOfSize:14]
                                   };
NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:text attributes:attributes];
[attributedText  drawInRect:CGRectMake(0,0,100,height)]

總結

整個控件的動畫都是由CAAnimationGroup的delegate調度的蕾哟,每個CAAnimationGroup完成后,繼續(xù)另外一個動畫莲蜘。 繪制箭頭的時候比較麻煩的是確定每個圓角的角度谭确、半徑與圓點,最好在Photoshop或者Sketch上確定好票渠。
在使用過程中逐哈,有可能需要需要縮小,這個時候可以通過view的矩陣變換 transform CGAffineTransformMakeScale 來設置大小问顷。

點擊下載Demo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末昂秃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子杜窄,更是在濱河造成了極大的恐慌肠骆,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塞耕,死亡現(xiàn)場離奇詭異蚀腿,居然都是意外死亡,警方通過查閱死者的電腦和手機扫外,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門莉钙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人筛谚,你說我怎么就攤上這事磁玉。” “怎么了刻获?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我蝎毡,道長厚柳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任沐兵,我火速辦了婚禮别垮,結果婚禮上,老公的妹妹穿的比我還像新娘扎谎。我一直安慰自己碳想,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布毁靶。 她就那樣靜靜地躺著胧奔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪预吆。 梳的紋絲不亂的頭發(fā)上龙填,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音拐叉,去河邊找鬼岩遗。 笑死,一個胖子當著我的面吹牛凤瘦,可吹牛的內容都是我干的宿礁。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼蔬芥,長吁一口氣:“原來是場噩夢啊……” “哼梆靖!你這毒婦竟也來了?” 一聲冷哼從身側響起坝茎,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤涤姊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嗤放,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體思喊,經...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年次酌,在試婚紗的時候發(fā)現(xiàn)自己被綠了恨课。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡岳服,死狀恐怖剂公,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情吊宋,我是刑警寧澤纲辽,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響拖吼,放射性物質發(fā)生泄漏鳞上。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一吊档、第九天 我趴在偏房一處隱蔽的房頂上張望篙议。 院中可真熱鬧,春花似錦怠硼、人聲如沸鬼贱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽这难。三九已至,卻和暖如春增显,著一層夾襖步出監(jiān)牢的瞬間雁佳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工同云, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留糖权,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓炸站,卻偏偏與公主長得像星澳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子旱易,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內容

  • 轉載:http://www.reibang.com/p/32fcadd12108 每個UIView有一個伙伴稱為l...
    F麥子閱讀 6,170評論 0 13
  • 在iOS中隨處都可以看到絢麗的動畫效果禁偎,實現(xiàn)這些動畫的過程并不復雜,今天將帶大家一窺iOS動畫全貌阀坏。在這里你可以看...
    F麥子閱讀 5,104評論 5 13
  • 在iOS中隨處都可以看到絢麗的動畫效果如暖,實現(xiàn)這些動畫的過程并不復雜,今天將帶大家一窺ios動畫全貌忌堂。在這里你可以看...
    每天刷兩次牙閱讀 8,471評論 6 30
  • 每個UIView有一個伙伴稱為layer盒至,一個CALayer。UIView實際上并沒有把自己畫到屏幕上;它繪制本身...
    shenzhenboy閱讀 3,091評論 0 17
  • Core Animation Core Animation士修,中文翻譯為核心動畫枷遂,它是一組非常強大的動畫處理API,...
    45b645c5912e閱讀 3,020評論 0 21