亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS粒子路徑移動效果 iOS實現QQ拖動效果

2020-07-26 02:44:40
字體:
來源:轉載
供稿:網友

粒子效果,QQ拖動效果,實現很簡單,具體代碼如下

一、圖示

這里寫圖片描述

二、分析

我們要實現的如果如上面的圖示,那么我們可以按照下面的步驟操作:

第一步:我們的紅點其實是一個UIButton。創建一個BageValueView繼承自UIButton

第二步:初始化的時候,初始化控件,設置圓角,修改背景、文字顏色

第三步:添加手勢。在手勢的處理中我們,我們需要讓當前控件隨著手指移動而移動。

第四步:控件一開始創建的時候,其實有兩個圓,一個就是我們能夠拖動的大圓,另外一個就是原始位置上會改變大小的圓。這一步驟中,主要就是創建這個小圓,它的初始參數和大圓一樣。
在手勢的處理中,根據兩圓的位置,來計算小圓半徑,當兩圓的位置大于最大位置時候,小圓隱藏掉。

//獲取兩個圓之間的距離CGFloat distance = [self distanceWithSmallCircle:self.smallCircle bigCircle:self];if(distance<=MAX_DIST){//只有距離不超過最大距離才計算小圓半徑 //計算小圓的半徑 //小圓半徑最小的時候是MIN_RADIUS,這個時候兩個圓達到最大距離MAX_DIST //小圓半徑最大的時候是原始半徑,這個時候兩圓距離是0 //處于前面兩者之間的時候,小圓的半徑是:MIN_RADIUS + (原始半徑 - MIN_RADIUS)/MAX_DIST * (MAX_DIST - 當前的距離) CGFloat smallR = self.bounds.size.width * 0.5; smallR = MIN_RADIUS + (MAX_DIST-distance) * (smallR-MIN_RADIUS)/MAX_DIST; //重新設置小圓的尺寸 self.smallCircle.bounds = CGRectMake(0, 0, smallR*2, smallR*2); //重新設置小圓的半徑 self.smallCircle.layer.cornerRadius = smallR;}else{//超過了最大距離 self.smallCircle.hidden = YES;}

第五步:創建大小圓之間的連接部分。連接部分我們需要創建一個形狀圖層(CAShapeLayer)――它可以根據一個路徑生成一個形狀。

路徑分析如下圖

根據上面我們需要創建一個 ABCDA 其中DA和BC是曲線,控制點分別為O和P。

第六步:當手勢結束的時候,我們需要判斷當前兩圓的位置,如果小圓最大距離,那么復位。如果大于最大距離,那么添加一個銷毀動畫。

三、代碼

2.1 BageValueView.m

//// BageValueView.m// 03_UIView78_粒子效果2//// Created by 杞文明 on 17/7/22.// Copyright © 2017年 杞文明. All rights reserved.//#import "BageValueView.h"#define MAX_DIST 80#define MIN_RADIUS 5@interface BageValueView()@property (nonatomic, weak) UIView *smallCircle;@property (nonatomic, weak) CAShapeLayer *shap;@end@implementation BageValueView-(void)awakeFromNib{ [self setUp];}-(instancetype)initWithFrame:(CGRect)frame{ if ( self = [super initWithFrame:frame] ) {  [self setUp]; } return self;}//形狀圖層-(CAShapeLayer*)shap{ if(_shap == nil){  //形狀圖層,它可以根據一個路徑生成一個形狀  CAShapeLayer *shap = [CAShapeLayer layer];  //設置形狀填充色  shap.fillColor = [UIColor redColor].CGColor;  _shap = shap;  //添加到最底層  [self.superview.layer insertSublayer:shap atIndex:0]; } return _shap;}//初始化-(void)setUp{ //設置圓角 self.layer.cornerRadius = self.bounds.size.width * 0.5; //設置背景文字顏色 [self setBackgroundColor:[UIColor redColor]]; [self setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; self.titleLabel.font = [UIFont systemFontOfSize:12]; //添加手勢 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(pan:)]; [self addGestureRecognizer:pan]; //添加小圓 UIView *smallCircle = [[UIView alloc]initWithFrame:self.frame]; smallCircle.backgroundColor = self.backgroundColor; smallCircle.layer.cornerRadius = self.layer.cornerRadius; self.smallCircle = smallCircle; //把小圓添加到父控件中,并且在大圓下面 [self.superview insertSubview:smallCircle belowSubview:self];}-(void)pan:(UIPanGestureRecognizer*)pan{ //獲取當前點 CGPoint currentP = [pan translationInView:self]; //移動 CGPoint center = self.center; center.x += currentP.x; center.y += currentP.y; self.center = center; //復位 [pan setTranslation:CGPointZero inView:self]; //獲取兩個圓之間的距離 CGFloat distance = [self distanceWithSmallCircle:self.smallCircle bigCircle:self]; if(distance<=MAX_DIST){//只有距離不超過最大距離才計算小圓半徑  //計算小圓的半徑  //小圓半徑最小的時候是MIN_RADIUS,這個時候兩個圓達到最大距離MAX_DIST  //小圓半徑最大的時候是原始半徑,這個時候兩圓距離是0  //處于前面兩者之間的時候,小圓的半徑是:MIN_RADIUS + (原始半徑 - MIN_RADIUS)/MAX_DIST * (MAX_DIST - 當前的距離)  CGFloat smallR = self.bounds.size.width * 0.5;  smallR = MIN_RADIUS + (MAX_DIST-distance) * (smallR-MIN_RADIUS)/MAX_DIST;  //重新設置小圓的尺寸  self.smallCircle.bounds = CGRectMake(0, 0, smallR*2, smallR*2);  //重新設置小圓的半徑  self.smallCircle.layer.cornerRadius = smallR; }else{//超過了最大距離  self.smallCircle.hidden = YES;  [self.shap removeFromSuperlayer]; } //創建不規則路徑,其實就是連個圓之間連接的部分 //小圓不隱藏才創建 if(self.smallCircle.hidden == NO){  UIBezierPath *path = [self pathWithSmallCircle:self.smallCircle bigCircle:self];  self.shap.path = path.CGPath; } //當手指松開的時候 if (pan.state==UIGestureRecognizerStateEnded) {  //如果兩圓之間的距離小于最大距離,大圓復位  if (distance<MAX_DIST) {   //移除形狀圖層   [self.shap removeFromSuperlayer];   //添加一個彈性動畫   [UIView animateWithDuration:0.25 delay:0 usingSpringWithDamping:0.2 initialSpringVelocity:0 options:UIViewAnimationOptionCurveLinear animations:^{    //大圓復位    self.center = self.smallCircle.center;   } completion:^(BOOL finished) {    //小圓顯示    self.smallCircle.hidden = NO;   }];  } else {   //距離大于最大位置的時候,播放動畫,按鈕從父控件中刪除   //添加一個UIImageView 用來播放動畫   UIImageView *imageV = [[UIImageView alloc] initWithFrame:self.bounds];   [self addSubview:imageV];   //添加圖片   NSMutableArray *imageArray = [NSMutableArray array];   for (int i=1; i<=8; i++) {    NSString *imageName = [NSString stringWithFormat:@"%d",i];    UIImage *image = [UIImage imageNamed:imageName];    [imageArray addObject:image];   }   imageV.animationImages = imageArray;   //設置動畫時長   [imageV setAnimationDuration:1];   //開始動畫   [imageV startAnimating];   //一秒鐘后.把當前的按鈕從父控件當中移.   dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{    [self removeFromSuperview];   });  } }}//計算兩個圓之間的距離 使用勾股定理:兩直角邊的平方和等于斜邊的平方- (CGFloat)distanceWithSmallCircle:(UIView *)smallCircle bigCircle:(UIView *)bigCircle{ //X軸上的偏移量(就是x1-x2的值) CGFloat offsetX = bigCircle.center.x - smallCircle.center.x; //y軸上的偏移量(就是y1-y2的值) CGFloat offsetY = bigCircle.center.y - smallCircle.center.y; return sqrt(offsetX*offsetX + offsetY*offsetY);}//根據兩個圓設置一個不規的路徑- (UIBezierPath *)pathWithSmallCircle:(UIView *)smallCircle bigCircle:(UIView *)bigCircle{ CGFloat x1 = smallCircle.center.x; CGFloat y1 = smallCircle.center.y; CGFloat x2 = bigCircle.center.x; CGFloat y2 = bigCircle.center.y; CGFloat d = [self distanceWithSmallCircle:smallCircle bigCircle:self]; if (d <= 0) {  return nil; } CGFloat cosθ = (y2 - y1) / d; CGFloat sinθ = (x2 - x1) / d; CGFloat r1 = smallCircle.bounds.size.width * 0.5; CGFloat r2 = bigCircle.bounds.size.width * 0.5; CGPoint pointA = CGPointMake(x1 - r1 * cosθ, y1 + r1 * sinθ); CGPoint pointB = CGPointMake(x1 + r1 * cosθ, y1 - r1 * sinθ); CGPoint pointC = CGPointMake(x2 + r2 * cosθ, y2 - r2 * sinθ); CGPoint pointD = CGPointMake(x2 - r2 * cosθ, y2 + r2 * sinθ); CGPoint pointO = CGPointMake(pointA.x + d * 0.5 * sinθ, pointA.y + d * 0.5 * cosθ); CGPoint pointP = CGPointMake(pointB.x + d * 0.5 * sinθ, pointB.y + d * 0.5 * cosθ); UIBezierPath *path = [UIBezierPath bezierPath]; //AB [path moveToPoint:pointA]; [path addLineToPoint:pointB]; //BC(曲線) [path addQuadCurveToPoint:pointC controlPoint:pointP]; //CD [path addLineToPoint:pointD]; //DA(曲線) [path addQuadCurveToPoint:pointA controlPoint:pointO]; return path;}//清空高亮狀態-(void)setHighlighted:(BOOL)highlighted{}@end

2.2 ViewController.m

//// ViewController.m// 03_UIView78_粒子效果2//// Created by 杞文明 on 17/7/22.// Copyright © 2017年 杞文明. All rights reserved.//#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; //讓View在顯示時不要把Autoresizing轉成自動布局 self.view.translatesAutoresizingMaskIntoConstraints = NO;}@end

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品v欧美精品v日韩精品| 亚洲一区二区三区xxx视频| 国模精品视频一区二区三区| 午夜精品久久久久久久99黑人| 成人xxxxx| 亚洲网站在线播放| 国产亚洲欧美日韩美女| 欧美一区第一页| 日韩欧美在线视频观看| 亚洲精品国产品国语在线| 岛国av在线不卡| 国产精品成人一区二区三区吃奶| 成人精品久久一区二区三区| 丝袜一区二区三区| 欧美激情欧美激情在线五月| 日韩综合中文字幕| 欧美大成色www永久网站婷| 亚洲欧美国产制服动漫| 欧美激情亚洲激情| 亚洲精品在线看| 国产免费一区二区三区在线观看| 国产一区二区久久精品| 91中文字幕一区| 亚洲丝袜在线视频| 久久久久国产视频| 91人人爽人人爽人人精88v| 亲子乱一区二区三区电影| 免费97视频在线精品国自产拍| 亚洲综合社区网| 国内精品免费午夜毛片| 在线日韩精品视频| 国产成人精品一区二区| 中文字幕久热精品视频在线| 亚洲性视频网站| 久久精品成人动漫| 播播国产欧美激情| 日本老师69xxx| 亚洲激情视频网站| 成人性生交xxxxx网站| 亚洲视频专区在线| 国a精品视频大全| 久久久亚洲影院你懂的| 日韩在线一区二区三区免费视频| 色琪琪综合男人的天堂aⅴ视频| 日韩av网站在线| 九九热视频这里只有精品| 国产精品一区=区| 国产精品 欧美在线| 97视频在线播放| 精品久久久一区二区| 久久频这里精品99香蕉| 亚洲www永久成人夜色| 午夜精品一区二区三区在线视频| 国产九九精品视频| 在线观看精品自拍私拍| 色在人av网站天堂精品| 亚洲免费视频网站| 国产在线观看91精品一区| 欧美成人中文字幕| 久久福利视频导航| 国产精品美乳一区二区免费| 日韩三级影视基地| 红桃视频成人在线观看| 国产精品人成电影在线观看| 成人在线激情视频| 国产99久久精品一区二区 夜夜躁日日躁| 国产女精品视频网站免费| 亚洲成人精品视频在线观看| 蜜臀久久99精品久久久久久宅男| 亚洲精品视频免费在线观看| 欧美成人精品一区二区三区| 韩国精品美女www爽爽爽视频| 青青草原成人在线视频| 国产精品丝袜视频| 97久久精品在线| 高清视频欧美一级| 欧美三级免费观看| 亚洲人成亚洲人成在线观看| 国产精品久久av| 全球成人中文在线| 日韩精品中文字幕有码专区| 亚洲国产精品久久精品怡红院| 久久伊人91精品综合网站| 91精品综合久久久久久五月天| 国产精品一二三视频| 中文字幕亚洲欧美| 91久久精品国产91久久性色| 亚洲人成网在线播放| 亚洲第一网中文字幕| 欧美精品成人91久久久久久久| 日韩在线中文字| 欧美性做爰毛片| 清纯唯美日韩制服另类| 亚洲已满18点击进入在线看片| 97精品国产97久久久久久春色| wwwwwwww亚洲| 在线色欧美三级视频| 国产午夜精品麻豆| 人人爽久久涩噜噜噜网站| 久久亚洲综合国产精品99麻豆精品福利| 亚洲人成自拍网站| 亚洲欧美激情另类校园| 久久久亚洲福利精品午夜| 久久这里有精品视频| 精品中文视频在线| 日韩欧美中文字幕在线播放| 日韩经典第一页| 欧美精品在线免费播放| 日韩精品在线视频美女| 欧美高清videos高潮hd| 久久久久一本一区二区青青蜜月| 久久综合国产精品台湾中文娱乐网| 精品高清一区二区三区| 疯狂做受xxxx欧美肥白少妇| 亚洲成人在线视频播放| 欧美精品激情blacked18| 77777亚洲午夜久久多人| 国产精品海角社区在线观看| 91热福利电影| 亚洲精品电影网在线观看| 欧美成人精品在线观看| 在线精品国产成人综合| 国产脚交av在线一区二区| 日本精品va在线观看| 91欧美日韩一区| 九九热精品视频| 国产一区二区三区在线免费观看| 97在线看福利| 久久久久久久网站| 欧美一级淫片aaaaaaa视频| 久精品免费视频| 色婷婷综合久久久久| 亚洲a中文字幕| 国外色69视频在线观看| 欧美精品午夜视频| 欧美电影免费在线观看| 精品国偷自产在线视频| 91视频国产高清| 成人在线视频网| 国产成人亚洲综合青青| 国产视频精品va久久久久久| 91精品美女在线| 久久久免费观看| 亚洲欧美中文日韩在线| 裸体女人亚洲精品一区| 国产精品久久一区| 国产主播精品在线| 这里只有精品视频在线| 亚洲国产精品电影| 中文字幕自拍vr一区二区三区| 久久久成人精品视频| 精品日韩美女的视频高清| 久久综合色88| 亚洲在线视频观看| 国产97色在线|日韩| 久久久久在线观看| 日韩av不卡电影| 色噜噜狠狠色综合网图区| 欧美第一黄网免费网站| 欧美激情一区二区三区高清视频| 亚洲黄在线观看| 欧美壮男野外gaytube| 国产日韩中文字幕在线| 8x海外华人永久免费日韩内陆视频|