最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS實(shí)現(xiàn)點(diǎn)贊動(dòng)畫(huà)特效

 更新時(shí)間:2021年01月29日 09:37:14   作者:mayifan_blog  
這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)點(diǎn)贊動(dòng)畫(huà)特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了iOS實(shí)現(xiàn)點(diǎn)贊動(dòng)畫(huà)特效的具體代碼,供大家參考,具體內(nèi)容如下

動(dòng)畫(huà)的基本使用

動(dòng)畫(huà)的實(shí)現(xiàn)基本上是基于對(duì)View控件和View的layer屬性進(jìn)行操作,對(duì)視圖進(jìn)行移動(dòng),尺寸變換,透明度變換,旋轉(zhuǎn)等一系列操作。

關(guān)鍵幀動(dòng)畫(huà):

動(dòng)畫(huà)的實(shí)現(xiàn)可以分為兩個(gè)部分,一部分是規(guī)定動(dòng)畫(huà)的變化內(nèi)容,比如view需要把scale從0變化到1,這個(gè)數(shù)字是相對(duì)值,即從尺寸為0變化到正常尺寸。另一個(gè)部分是規(guī)定動(dòng)畫(huà)的漸變時(shí)間。這樣就實(shí)現(xiàn)了view在規(guī)定時(shí)間完成指定變化了,這個(gè)變化的過(guò)程也可以通過(guò)參數(shù)設(shè)置為非均勻變化的。上面的示例是關(guān)鍵幀動(dòng)畫(huà)的實(shí)現(xiàn),實(shí)現(xiàn)的方式是把動(dòng)畫(huà)劃分為幾個(gè)部分,“第一幀”做一件事,“第二幀”再做另外一件事,這就使得變化連續(xù)且可控。Duration參數(shù)確定了時(shí)間,delay確定了延時(shí)多久執(zhí)行,options確定了關(guān)鍵幀動(dòng)畫(huà)布局子控件。completion的參數(shù)是一個(gè)block,其中的內(nèi)容是在內(nèi)容執(zhí)行結(jié)束后才調(diào)用。這里做了3幀,前兩幀做了尺寸變?yōu)?倍然后恢復(fù),后一幀使得其隱藏。結(jié)束后會(huì)調(diào)用block使其移除。

[UIView animateKeyframesWithDuration:self.animationDurtion * 4 delay:0.0 options:UIViewKeyframeAnimationOptionLayoutSubviews animations:^{
   /*參數(shù)1:關(guān)鍵幀開(kāi)始時(shí)間
    參數(shù)2:關(guān)鍵幀占用時(shí)間比例
    參數(shù)3:到達(dá)該關(guān)鍵幀時(shí)的屬性值 */
   [UIView addKeyframeWithRelativeStartTime:0.0 relativeDuration:0.5 * self.animationDurtion animations:^{
    giveLikeView.transform = CGAffineTransformMakeScale(3, 3);;
   }];
   [UIView addKeyframeWithRelativeStartTime:0.5 * self.animationDurtion relativeDuration:0.5 * self.animationDurtion animations:^{
    giveLikeView.transform = CGAffineTransformIdentity;
   }];
   [UIView addKeyframeWithRelativeStartTime:self.animationDurtion relativeDuration:self.animationDurtion * 3 animations:^{
    giveLikeView.alpha = 0;
   }];
  } completion:^(BOOL finished) {
   giveLikeView.hidden = YES;
   [giveLikeView removeFromSuperview];
  }];

CAShapeLayer和UIBezierPath:

當(dāng)不滿足于view的變化,還需要在view的表面繪制一些圖案,就要對(duì)layer進(jìn)行操作,layer可以理解為是view的表面,每個(gè)view都有l(wèi)ayer參數(shù)。UIBezierPath是貝塞爾曲線,它用于設(shè)置繪圖的路徑,沒(méi)有了它,layer的繪制也是無(wú)效的,因?yàn)闆](méi)有邊界呀。
如下代碼繪制了一個(gè)圓形的曲線,設(shè)置了它的中心,半徑,起始終止角這些屬性。

UIBezierPath *bezierPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(giveLikeView.bounds.size.width/2, giveLikeView.bounds.size.height/2) radius:giveLikeView.bounds.size.width startAngle:-1.57 endAngle:-1.57+3.14*2 clockwise:YES];
 circleLayer.path = bezierPath.CGPath;
 [self.layer addSublayer:circleLayer];

在最后我們可以看到:circleLayer.path = bezierPath.CGPath; [self.layer addSublayer:circleLayer];
它的作用是設(shè)置layer的路徑,并把layer添加到view的表面。下面來(lái)看看layer的配置。
創(chuàng)建一個(gè)layer后設(shè)置它的frame和顏色以及邊界,線寬這些屬性。

CAShapeLayer *circleLayer = [[CAShapeLayer alloc] init];
circleLayer.frame = giveLikeView.frame;
circleLayer.fillColor = [UIColor clearColor].CGColor;
circleLayer.strokeColor = [UIColor redColor].CGColor;
circleLayer.lineWidth = 1;

幾處聯(lián)系:把貝塞爾曲線和layer聯(lián)系起來(lái),把layer和view的layer聯(lián)系起來(lái)。

為layer加動(dòng)畫(huà)(動(dòng)畫(huà)組):

先創(chuàng)建動(dòng)畫(huà)組CAAnimationGroup,它可以容納若干動(dòng)畫(huà),然后創(chuàng)建若干CABasicAnimation基礎(chǔ)動(dòng)畫(huà)。分別設(shè)置屬性,動(dòng)畫(huà)組需要涉及的屬性有時(shí)間功能,kCAMediaTimingFunctionEaseIn表示逐漸加快,另外還有設(shè)置持續(xù)時(shí)間,設(shè)置kCAFillModeForwards表示動(dòng)畫(huà)在結(jié)束后會(huì)保持,removedOnCompletion = NO表示最后不移除。在基礎(chǔ)動(dòng)畫(huà)的設(shè)置中,一般設(shè)置在動(dòng)畫(huà)組中的起始時(shí)間和持續(xù)時(shí)間,還有參數(shù)的變化。最后的 group.animations = @[scaleAnimtion,widthStartAnimtion,widthEndAnimtion];[circleLayer addAnimation:group forKey:nil];
兩句表示在動(dòng)畫(huà)組中添加動(dòng)畫(huà)然后為layer添加動(dòng)畫(huà)組,這樣layer就有動(dòng)畫(huà)特效了。

//動(dòng)畫(huà)
CAAnimationGroup *group = [CAAnimationGroup animation];
 group.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
 NSTimeInterval groupInterval = self.animationDurtion * 0.8;
 group.duration = groupInterval;
 group.fillMode = kCAFillModeForwards;
 group.removedOnCompletion = NO;
 
CABasicAnimation * scaleAnimtion = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
 scaleAnimtion.beginTime = 0;
 scaleAnimtion.duration = groupInterval * 0.8;
 scaleAnimtion.fromValue = @(0);
 scaleAnimtion.toValue = @(1);
 
CABasicAnimation * widthStartAnimtion = [CABasicAnimation animationWithKeyPath:@"lineWidth"];
 widthStartAnimtion.beginTime = 0;
 widthStartAnimtion.duration = groupInterval * 0.8;
 widthStartAnimtion.fromValue = @(1);
 widthStartAnimtion.toValue = @(2);
 
CABasicAnimation * widthEndAnimtion = [CABasicAnimation animationWithKeyPath:@"lineWidth"];
 widthEndAnimtion.beginTime = groupInterval * 0.8;
 widthEndAnimtion.duration = groupInterval * 0.2;
 widthEndAnimtion.fromValue = @(2);
 widthEndAnimtion.toValue = @(0);
 
 group.animations = @[scaleAnimtion,widthStartAnimtion,widthEndAnimtion];
 [circleLayer addAnimation:group forKey:nil];

點(diǎn)贊動(dòng)畫(huà)的實(shí)現(xiàn)原理

下面來(lái)介紹demo的實(shí)現(xiàn)原理。

controller的尺寸設(shè)置為全屏,在其上方也覆蓋一個(gè)全屏的view,再在view上添加點(diǎn)擊事件(手勢(shì))。

- (void)addGesture
{
 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(creatOneHeart:)];
 [self addGestureRecognizer:tap]; 
}

下面看看點(diǎn)擊后調(diào)用的方法:

這里每次點(diǎn)擊都會(huì)獲取點(diǎn)擊的位置然后去初始化一個(gè)愛(ài)心,這是異步任務(wù),放在主隊(duì)列中執(zhí)行。

- (void)creatOneHeart:(UITapGestureRecognizer *)sender
{
 CGPoint point = [sender locationInView:self];
 dispatch_async(dispatch_get_main_queue(),^{
  [self initOneNewHeart:point];
 });
}

這段代碼創(chuàng)建了視圖對(duì)象,這里自然用到了事先創(chuàng)建好的心形圖片。這里把創(chuàng)建的imageview存到隊(duì)列,顯示到view上,最后調(diào)用likeAction:方法執(zhí)行動(dòng)畫(huà)。

- (UIImageView *)createGiveLikeView
{
 UIImageView *giveLikeView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
 giveLikeView.backgroundColor = [UIColor clearColor];
 UIImage *image = [UIImage imageNamed:@"icon_home_like_after"];
 giveLikeView.userInteractionEnabled = YES;
 giveLikeView.tag = GiveType;
 giveLikeView.image = image;
 giveLikeView.hidden = NO;
 _giveLikeView = giveLikeView;
 return _giveLikeView;
}
- (void)initOneNewHeart:(CGPoint)point
{
 UIImageView *giveLikeView = [self createGiveLikeView];
 giveLikeView.center = point;
 [self.array addObject:giveLikeView];
 [self addSubview:giveLikeView];
 [self likeAction:giveLikeView];
}

我們看看giveLikeAction:這個(gè)方法,它包括執(zhí)行心形的變化動(dòng)畫(huà)和繪制六個(gè)輻射的三角形動(dòng)畫(huà),還有輻散的圓的動(dòng)畫(huà)。

- (void)likeAction:(UIImageView *)giveLikeView
{
 [self giveLikeAction:giveLikeView];
}
- (void)giveLikeAction:(UIImageView *)giveLikeView
{
 [self animtionChangeLikeType:giveLikeView];
 [self createTrigonsAnimtion:giveLikeView];
 [self createCircleAnimation:giveLikeView];
}

接下來(lái)直接看看輻散的三角形的動(dòng)畫(huà)(愛(ài)心的變化動(dòng)畫(huà)在上面已經(jīng)涉及到了):
這段代碼跑了6個(gè)循環(huán),做了6個(gè)三角形,它們分別有動(dòng)畫(huà)效果。
shape.transform = CATransform3DMakeRotation(3.14 / 3 * i, 0, 0, 1);實(shí)現(xiàn)了旋轉(zhuǎn)。
[giveLikeView.layer addSublayer:shape];執(zhí)行l(wèi)ayer的添加。
因?yàn)樵谘h(huán)中,每個(gè)layer都有獨(dú)立的動(dòng)畫(huà),動(dòng)畫(huà)組實(shí)現(xiàn)的效果是三角形從小變大,最后變成一條直線并消失。
下面的兩行代碼用到了__bridge,它的作用是實(shí)現(xiàn)類型的轉(zhuǎn)換,這里把CGPathRef類型“橋接”轉(zhuǎn)化為了id類型,如果沒(méi)有它,會(huì)報(bào)錯(cuò)。
pathAnimation.fromValue = (__bridge id)startPath.CGPath;
pathAnimation.toValue = (__bridge id)endPath.CGPath;

- (void)createTrigonsAnimtion:(UIImageView *)giveLikeView
{
 for(int i=0;i<6;i++) {
  //創(chuàng)建一個(gè)layer并設(shè)置位置和填充色
  CAShapeLayer *shape = [[CAShapeLayer alloc] init];
  shape.position = CGPointMake(giveLikeView.bounds.size.width/2, giveLikeView.bounds.size.height/2);
  shape.fillColor = [UIColor redColor].CGColor;
  //設(shè)置貝塞爾曲線,執(zhí)行路徑
  UIBezierPath *startPath = [[UIBezierPath alloc] init];
  [startPath moveToPoint:CGPointMake(-2, 30)];
  [startPath addLineToPoint:CGPointMake(2, 30)];
  [startPath addLineToPoint:CGPointMake(0, 0)];
  [startPath addLineToPoint:CGPointMake(-2, 30)];
  shape.path = startPath.CGPath;
  
  //旋轉(zhuǎn)
  shape.transform = CATransform3DMakeRotation(3.14 / 3 * i, 0, 0, 1);
  [giveLikeView.layer addSublayer:shape];
  
  //動(dòng)畫(huà)組
  CAAnimationGroup *groupAnimation = [CAAnimationGroup animation];
  groupAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
  groupAnimation.duration = self.animationDurtion;
  groupAnimation.fillMode = kCAFillModeForwards;
  groupAnimation.removedOnCompletion = NO;
  
  //基礎(chǔ)動(dòng)畫(huà)1
  CABasicAnimation *scaleAnimtion = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
  //縮放時(shí)間占20%
  scaleAnimtion.duration = self.animationDurtion * 0.2;
  scaleAnimtion.fromValue = @(0);
  scaleAnimtion.toValue = @(1);

  //繪制三角形結(jié)束 一條直線
  UIBezierPath *endPath = [UIBezierPath bezierPath];
  [endPath moveToPoint:CGPointMake(-2, 30)];
  [endPath addLineToPoint:CGPointMake(2, 30)];
  [endPath addLineToPoint:CGPointMake(0, 30)];

  //基礎(chǔ)動(dòng)畫(huà)2
  CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"path"];
  pathAnimation.beginTime = self.animationDurtion * 0.2;
  pathAnimation.duration = self.animationDurtion * 0.8;
  pathAnimation.fromValue = (__bridge id)startPath.CGPath;
  pathAnimation.toValue = (__bridge id)endPath.CGPath;

  groupAnimation.animations = @[scaleAnimtion,pathAnimation];
  [shape addAnimation:groupAnimation forKey:nil];
 }
}

demo實(shí)現(xiàn)的動(dòng)畫(huà)效果

demo的GitHub鏈接

最后附上demo鏈接:MYFGiveLikeAnimationDemo

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • iOS中UIScrollView嵌套UITableView的實(shí)踐教程

    iOS中UIScrollView嵌套UITableView的實(shí)踐教程

    在UIScrollView嵌套UITableView的問(wèn)題相信大家都遇到過(guò),小編最近在工作中就遇到了這個(gè)問(wèn)題,所以這篇文章主要介紹了iOS中UIScrollView嵌套UITableView的相關(guān)資料,文中介紹的方法是通過(guò)自己的實(shí)踐所得來(lái)的,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-05-05
  • iOS音樂(lè)播放器實(shí)現(xiàn)代碼完整版

    iOS音樂(lè)播放器實(shí)現(xiàn)代碼完整版

    這篇文章主要為大家詳細(xì)介紹了iOS音樂(lè)播放器實(shí)現(xiàn)代碼完整版,包括音頻列表、播放器、后臺(tái)播放、鎖屏播放,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • UITableViewCell在編輯狀態(tài)下背景顏色的修改方法

    UITableViewCell在編輯狀態(tài)下背景顏色的修改方法

    這篇文章主要給大家介紹了關(guān)于UITableViewCell在編輯狀態(tài)下背景顏色的修改方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。
    2017-07-07
  • iOS程序開(kāi)發(fā)之使用PlaceholderImageView實(shí)現(xiàn)優(yōu)雅的圖片加載效果

    iOS程序開(kāi)發(fā)之使用PlaceholderImageView實(shí)現(xiàn)優(yōu)雅的圖片加載效果

    這篇文章主要介紹了ioS程序開(kāi)發(fā)之使用PlaceholderImageView實(shí)現(xiàn)優(yōu)雅的圖片加載效果的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • iOS 委托與文本輸入(內(nèi)容根據(jù)iOS編程編寫)

    iOS 委托與文本輸入(內(nèi)容根據(jù)iOS編程編寫)

    這篇文章主要介紹了iOS 委托與文本輸入(內(nèi)容根據(jù)iOS編程編寫) 的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • iOS實(shí)現(xiàn)支付寶螞蟻森林隨機(jī)按鈕及抖動(dòng)效果

    iOS實(shí)現(xiàn)支付寶螞蟻森林隨機(jī)按鈕及抖動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)支付寶螞蟻森林隨機(jī)按鈕及抖動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • iOS功能實(shí)現(xiàn)之列表的橫向刷新加載

    iOS功能實(shí)現(xiàn)之列表的橫向刷新加載

    現(xiàn)今已有越來(lái)越多的APP需要橫向刷新的需求,而橫向刷新加載的控件卻寥寥無(wú)幾,即使有也是集成起來(lái)非常的麻煩,恰巧最近項(xiàng)目中又用到了這個(gè)功能,所以干脆自己來(lái)造個(gè)輪子,方便大家使用。
    2016-08-08
  • iOS實(shí)現(xiàn)UITableView數(shù)據(jù)為空時(shí)的提示頁(yè)面

    iOS實(shí)現(xiàn)UITableView數(shù)據(jù)為空時(shí)的提示頁(yè)面

    最近工作中遇到一個(gè)需求,當(dāng)UITableView數(shù)據(jù)為空的時(shí)候,給出一個(gè)簡(jiǎn)單的提示頁(yè)面,通過(guò)從網(wǎng)上查找解決的方法,發(fā)現(xiàn)了兩種實(shí)現(xiàn)的方法,現(xiàn)在分享給大家,有需要的朋友們可以參考借鑒,下面感興趣的朋友們來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11
  • iOS?StoreKit?2?新特性盤點(diǎn)解析

    iOS?StoreKit?2?新特性盤點(diǎn)解析

    這篇文章主要為大家介紹了iOS?StoreKit?2?新特性盤點(diǎn)及要點(diǎn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • iOS撥打電話的3種實(shí)現(xiàn)方式

    iOS撥打電話的3種實(shí)現(xiàn)方式

    這篇文章主要介紹了iOS撥打電話的3種實(shí)現(xiàn)方式 ,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-06-06

最新評(píng)論

澄江县| 洪泽县| 平和县| 上林县| 松滋市| 宁陵县| 丹棱县| 澜沧| 江永县| 射阳县| 庆元县| 个旧市| 东明县| 临漳县| 通州市| 高安市| 神农架林区| 平原县| 易门县| 岚皋县| 通道| 密山市| 金阳县| 买车| 鄂尔多斯市| 田东县| 康乐县| 潞西市| 晋中市| 阿瓦提县| 宝清县| 蓝山县| 塔城市| 色达县| 丰县| 朝阳区| 桑日县| 老河口市| 常熟市| 耒阳市| 石家庄市|