iOS直播APP-點(diǎn)贊動(dòng)畫(huà)的實(shí)現(xiàn)

因工作需要,高仿【喵播】的Demo核心功能基本完成锌半。直播端音視頻采集禽车、推流、內(nèi)置音樂(lè)播放器系統(tǒng)刊殉,播放端的視頻拉流播放殉摔、直播聊天室即時(shí)通信等功能已經(jīng)完成。不過(guò)今天不是要講這些看似高大上的東西记焊,今天還是繼續(xù)說(shuō)說(shuō)直播APP中的一些細(xì)枝末節(jié)逸月,哈哈,不要著急遍膜,等忙過(guò)這段時(shí)間我會(huì)系統(tǒng)的寫(xiě)一篇關(guān)于iOS直播APP的文章碗硬,不想錯(cuò)過(guò)的小伙伴瓤湘,敬請(qǐng)關(guān)注!6魑病弛说!。

今天要說(shuō)的是直播APP的點(diǎn)贊動(dòng)畫(huà)翰意,看下圖木人,這是我仿【喵播】做的界面,點(diǎn)擊屏幕會(huì)有心型動(dòng)畫(huà)飄出冀偶;這些動(dòng)畫(huà)圖片都是從喵播APP抓下來(lái)的醒第,如果你還不知道怎么抓一個(gè)APP的圖片素材,文章后面有介紹蔫磨,絕對(duì)夠驚喜淘讥。

直播點(diǎn)贊動(dòng)畫(huà).gif

下面進(jìn)入正題:
點(diǎn)贊動(dòng)畫(huà)的實(shí)現(xiàn)邏輯:
1、點(diǎn)擊屏幕觸發(fā)點(diǎn)擊事件堤如,生成一個(gè)imageView并給其添加一張隨機(jī)的圖片
2蒲列、給imageView設(shè)置有一個(gè)初始frame值
3、開(kāi)始動(dòng)畫(huà)搀罢,設(shè)置動(dòng)畫(huà)執(zhí)行
4蝗岖、給這個(gè)imageView設(shè)置一個(gè)終點(diǎn)frame值
5、結(jié)束動(dòng)畫(huà)
6榔至、銷(xiāo)毀imageView
這是動(dòng)畫(huà)的大致實(shí)現(xiàn)邏輯抵赢,有很多細(xì)節(jié)和參數(shù)配置問(wèn)題,代碼注釋的很清楚唧取,直接看代碼就OK了:

  • 給view添加點(diǎn)擊事件:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        // 點(diǎn)贊
        [self praiseAnimation];
}
  • 動(dòng)畫(huà)核心代碼:
#pragma mark - 點(diǎn)贊動(dòng)畫(huà)
- (void)praiseAnimation {
    UIImageView *imageView = [[UIImageView alloc] init];
    CGRect frame = self.view.frame;
    //  初始frame铅鲤,即設(shè)置了動(dòng)畫(huà)的起點(diǎn)
    imageView.frame = CGRectMake(frame.size.width - 40, frame.size.height - 65, 30, 30);
    //  初始化imageView透明度為0
    imageView.alpha = 0;
    imageView.backgroundColor = [UIColor clearColor];
    imageView.clipsToBounds = YES;
    //  用0.2秒的時(shí)間將imageView的透明度變成1.0,同時(shí)將其放大1.3倍枫弟,再縮放至1.1倍邢享,這里參數(shù)根據(jù)需求設(shè)置
    [UIView animateWithDuration:0.2 animations:^{
        imageView.alpha = 1.0;
        imageView.frame = CGRectMake(frame.size.width - 40, frame.size.height - 90, 30, 30);
        CGAffineTransform transfrom = CGAffineTransformMakeScale(1.3, 1.3);
        imageView.transform = CGAffineTransformScale(transfrom, 1, 1);
    }];
    [self.view addSubview:imageView];
    //  隨機(jī)產(chǎn)生一個(gè)動(dòng)畫(huà)結(jié)束點(diǎn)的X值
    CGFloat finishX = frame.size.width - round(random() % 200);
    //  動(dòng)畫(huà)結(jié)束點(diǎn)的Y值
    CGFloat finishY = 200;
    //  imageView在運(yùn)動(dòng)過(guò)程中的縮放比例
    CGFloat scale = round(random() % 2) + 0.7;
    // 生成一個(gè)作為速度參數(shù)的隨機(jī)數(shù)
    CGFloat speed = 1 / round(random() % 900) + 0.6;
    //  動(dòng)畫(huà)執(zhí)行時(shí)間
    NSTimeInterval duration = 4 * speed;
    //  如果得到的時(shí)間是無(wú)窮大,就重新附一個(gè)值(這里要特別注意淡诗,請(qǐng)看下面的特別提醒)
    if (duration == INFINITY) duration = 2.412346;
    // 隨機(jī)生成一個(gè)0~7的數(shù)骇塘,以便下面拼接圖片名
    int imageName = round(random() % 8);
    
    //  開(kāi)始動(dòng)畫(huà)
    [UIView beginAnimations:nil context:(__bridge void *_Nullable)(imageView)];
    //  設(shè)置動(dòng)畫(huà)時(shí)間
    [UIView setAnimationDuration:duration];
    
    //  拼接圖片名字
    imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"good%d_30x30_.png",imageName]];
    
    //  設(shè)置imageView的結(jié)束frame
    imageView.frame = CGRectMake( finishX, finishY, 30 * scale, 30 * scale);
    
    //  設(shè)置漸漸消失的效果,這里的時(shí)間最好和動(dòng)畫(huà)時(shí)間一致
    [UIView animateWithDuration:duration animations:^{
        imageView.alpha = 0;
    }];
    
    //  結(jié)束動(dòng)畫(huà)韩容,調(diào)用onAnimationComplete:finished:context:函數(shù)
    [UIView setAnimationDidStopSelector:@selector(onAnimationComplete:finished:context:)];
    //  設(shè)置動(dòng)畫(huà)代理
    [UIView setAnimationDelegate:self];
    [UIView commitAnimations];
}
  • 動(dòng)畫(huà)完成后執(zhí)行:
/// 動(dòng)畫(huà)完后銷(xiāo)毀iamgeView
- (void)onAnimationComplete:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context{
    UIImageView *imageView = (__bridge UIImageView *)(context);
    [imageView removeFromSuperview];
    imageView = nil;
}

至此就完成了簡(jiǎn)單的點(diǎn)贊功能款违,很簡(jiǎn)單吧!

特別提醒:

    // 生成一個(gè)作為速度參數(shù)的隨機(jī)數(shù)
    CGFloat speed = 1 / round(random() % 900) + 0.6;
    //  動(dòng)畫(huà)執(zhí)行時(shí)間
    NSTimeInterval duration = 4 * speed;
    NSLog(@"時(shí)間--%f",duration);

執(zhí)行上面這段代碼群凶,打印結(jié)果插爹,發(fā)現(xiàn)偶爾會(huì)打印出inf,inf是無(wú)窮大的意思,出現(xiàn)這個(gè)值座掘,也就意味著你屏幕上會(huì)有一個(gè)圖片停在那不動(dòng)递惋,這就尷尬啦柔滔!

50A7E962-AC81-4198-A567-2F587D1AFE12.png

所以要加上這句判斷:

    //  如果得到的時(shí)間是無(wú)窮大溢陪,就重新附一個(gè)值(這里要特別注意萍虽,請(qǐng)看下面的特別提醒)
    if (duration == INFINITY) duration = 2.412346;
```

下面絕對(duì)的大**彩蛋**:
**抓取APP素材的方法:**
1、下載安裝[iOS images Extractor](https://pan.baidu.com/s/1dE1zgEd)到你的Mac上
2形真、在iTunes的AppStore上下載你需要抓取素材的APP
3杉编、進(jìn)入iTunes的`我的應(yīng)用`,找到你剛下載的APP咆霜,右擊選擇`在Finder中顯示`
![B498B849-4B22-451F-89F4-9253186BE581.png](http://upload-images.jianshu.io/upload_images/1707533-6282076d2484ecb7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

*  Finder中顯示的APP ipa文件
![87A0C97F-E041-4A4B-9A34-DC69EE91809A.png](http://upload-images.jianshu.io/upload_images/1707533-4812307815b0bc0d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

4邓馒、打開(kāi)[iOS images Extractor](https://pan.baidu.com/s/1dE1zgEd),直接將APP ipa拖進(jìn)去蛾坯,點(diǎn)擊start等幾秒光酣,OK完成了。
![2E845738-9BA5-4B17-8B6D-15716B02D111.png](http://upload-images.jianshu.io/upload_images/1707533-13d44b0e7f9c584b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
5脉课、在 `下載`文件中找到APP素材(文件保存路徑你可以自己設(shè)置救军,不再贅述)
![CC37D6CF-E395-48F9-A3A9-2D0E707317D9.png](http://upload-images.jianshu.io/upload_images/1707533-072b482cec78c8c5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
是不是夠驚喜,用[iOS images Extractor](https://pan.baidu.com/s/1dE1zgEd)抓取APP內(nèi)的圖片就是這么簡(jiǎn)單倘零,在也不同擔(dān)心以后寫(xiě)Demo界面丑到不能看了唱遭。哈哈,今天就說(shuō)這么多呈驶,喜歡的點(diǎn)贊加關(guān)注吧?皆蟆!袖瞻!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末司致,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子聋迎,更是在濱河造成了極大的恐慌脂矫,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砌庄,死亡現(xiàn)場(chǎng)離奇詭異羹唠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)娄昆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)佩微,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人萌焰,你說(shuō)我怎么就攤上這事哺眯。” “怎么了扒俯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵奶卓,是天一觀的道長(zhǎng)一疯。 經(jīng)常有香客問(wèn)我,道長(zhǎng)夺姑,這世上最難降的妖魔是什么墩邀? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮盏浙,結(jié)果婚禮上眉睹,老公的妹妹穿的比我還像新娘。我一直安慰自己废膘,他們只是感情好竹海,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著丐黄,像睡著了一般斋配。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灌闺,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天艰争,我揣著相機(jī)與錄音,去河邊找鬼菩鲜。 笑死园细,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的接校。 我是一名探鬼主播猛频,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蛛勉!你這毒婦竟也來(lái)了鹿寻?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤诽凌,失蹤者是張志新(化名)和其女友劉穎毡熏,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體侣诵,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痢法,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杜顺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片财搁。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖躬络,靈堂內(nèi)的尸體忽然破棺而出尖奔,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布提茁,位于F島的核電站淹禾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏茴扁。R本人自食惡果不足惜铃岔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丹弱。 院中可真熱鬧德撬,春花似錦铲咨、人聲如沸躲胳。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)坯苹。三九已至,卻和暖如春摇天,著一層夾襖步出監(jiān)牢的瞬間粹湃,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工泉坐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留为鳄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓腕让,卻偏偏與公主長(zhǎng)得像孤钦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纯丸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容