全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

iOS粒子路径移动效果 iOS实现QQ拖动效果

粒子效果,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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# iOS路径移动  # iOS  # QQ拖动效果  # iOS粒子效果  # iOS实现一个可以在屏幕中自由移动的按钮  # ios实现简单随便移动的AR功能  # 小圆  # 这个时候  # 图层  # 创建一个  # 它可以  # 不超过  # 拖动  # 平方和  # 是一个  # 勾股定理  # 圆角  # 这一  # 偏移量  # 超过了  # 要把  # 我们可以  # 很简单  # 分别为  # 另外一个  # 第二步 


相关文章: c# 在ASP.NET Core中管理和取消后台任务  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  如何用5美元大硬盘VPS安全高效搭建个人网站?  宝塔建站无法访问?如何排查配置与端口问题?  如何在七牛云存储上搭建网站并设置自定义域名?  建站之星安装需要哪些步骤及注意事项?  沈阳制作网站公司排名,沈阳装饰协会官方网站?  建站主机选购指南:核心配置优化与品牌推荐方案  网站app免费制作软件,能免费看各大网站视频的手机app?  建站之星后台密码遗忘或太弱?如何重置与强化?  如何通过二级域名建站提升品牌影响力?  如何获取免费开源的自助建站系统源码?  动图在线制作网站有哪些,滑动动图图集怎么做?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  如何挑选最适合建站的高性能VPS主机?  微信小程序 五星评分(包括半颗星评分)实例代码  建站之星如何快速更换网站模板?  如何通过老薛主机一键快速建站?  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  h5在线制作网站电脑版下载,h5网页制作软件?  如何配置IIS站点权限与局域网访问?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  盘锦网站制作公司,盘锦大洼有多少5G网站?  如何通过多用户协作模板快速搭建高效企业网站?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  如何通过山东自助建站平台快速注册域名?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  网站网页制作专业公司,怎样制作自己的网页?  如何快速搭建高效WAP手机网站吸引移动用户?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  制作企业网站建设方案,怎样建设一个公司网站?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  如何快速生成凡客建站的专业级图册?  小程序网站制作需要准备什么资料,如何制作小程序?  名字制作网站免费,所有小说网站的名字?  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  网站企业制作流程,用什么语言做企业网站比较好?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  c# await 一个已经完成的Task会发生什么  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  广州商城建站系统开发成本与周期如何控制?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  宝塔建站后网页无法访问如何解决?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  北京专业网站制作设计师招聘,北京白云观官方网站?  制作网站外包平台,自动化接单网站有哪些?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  网站制作多少钱一个,建一个论坛网站大约需要多少钱? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。