欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

iOS粒子路徑移動(dòng)效果 iOS實(shí)現(xiàn)QQ拖動(dòng)效果

 更新時(shí)間:2017年07月23日 10:16:58   作者:憤怒的小明  
這篇文章主要為大家詳細(xì)介紹了iOS粒子路徑移動(dòng)效果,iOS實(shí)現(xiàn)QQ拖動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

粒子效果,QQ拖動(dòng)效果,實(shí)現(xiàn)很簡單,具體代碼如下

一、圖示

這里寫圖片描述

二、分析

我們要實(shí)現(xiàn)的如果如上面的圖示,那么我們可以按照下面的步驟操作:

第一步:我們的紅點(diǎn)其實(shí)是一個(gè)UIButton。創(chuàng)建一個(gè)BageValueView繼承自UIButton

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

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

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

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

第五步:創(chuàng)建大小圓之間的連接部分。連接部分我們需要?jiǎng)?chuàng)建一個(gè)形狀圖層(CAShapeLayer)——它可以根據(jù)一個(gè)路徑生成一個(gè)形狀。

路徑分析如下圖

根據(jù)上面我們需要?jiǎng)?chuàng)建一個(gè) ABCDA 其中DA和BC是曲線,控制點(diǎn)分別為O和P。

第六步:當(dāng)手勢結(jié)束的時(shí)候,我們需要判斷當(dāng)前兩圓的位置,如果小圓最大距離,那么復(fù)位。如果大于最大距離,那么添加一個(gè)銷毀動(dòng)畫。

三、代碼

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){
  //形狀圖層,它可以根據(jù)一個(gè)路徑生成一個(gè)形狀
  CAShapeLayer *shap = [CAShapeLayer layer];
  //設(shè)置形狀填充色
  shap.fillColor = [UIColor redColor].CGColor;
  _shap = shap;
  //添加到最底層
  [self.superview.layer insertSublayer:shap atIndex:0];
 }
 return _shap;
}

//初始化
-(void)setUp{
 //設(shè)置圓角
 self.layer.cornerRadius = self.bounds.size.width * 0.5;

 //設(shè)置背景文字顏色
 [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{
 //獲取當(dāng)前點(diǎn)
 CGPoint currentP = [pan translationInView:self];
 //移動(dòng)
 CGPoint center = self.center;
 center.x += currentP.x;
 center.y += currentP.y;
 self.center = center;
 //復(fù)位
 [pan setTranslation:CGPointZero inView:self];

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

 //創(chuàng)建不規(guī)則路徑,其實(shí)就是連個(gè)圓之間連接的部分
 //小圓不隱藏才創(chuàng)建
 if(self.smallCircle.hidden == NO){
  UIBezierPath *path = [self pathWithSmallCircle:self.smallCircle bigCircle:self];
  self.shap.path = path.CGPath;
 }

 //當(dāng)手指松開的時(shí)候
 if (pan.state==UIGestureRecognizerStateEnded) {
  //如果兩圓之間的距離小于最大距離,大圓復(fù)位
  if (distance<MAX_DIST) {
   //移除形狀圖層
   [self.shap removeFromSuperlayer];
   //添加一個(gè)彈性動(dòng)畫
   [UIView animateWithDuration:0.25 delay:0 usingSpringWithDamping:0.2 initialSpringVelocity:0 options:UIViewAnimationOptionCurveLinear animations:^{
    //大圓復(fù)位
    self.center = self.smallCircle.center;
   } completion:^(BOOL finished) {
    //小圓顯示
    self.smallCircle.hidden = NO;
   }];
  } else {
   //距離大于最大位置的時(shí)候,播放動(dòng)畫,按鈕從父控件中刪除
   //添加一個(gè)UIImageView 用來播放動(dòng)畫
   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;
   //設(shè)置動(dòng)畫時(shí)長
   [imageV setAnimationDuration:1];
   //開始動(dòng)畫
   [imageV startAnimating];

   //一秒鐘后.把當(dāng)前的按鈕從父控件當(dāng)中移.
   dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [self removeFromSuperview];
   });
  }
 }
}

//計(jì)算兩個(gè)圓之間的距離 使用勾股定理:兩直角邊的平方和等于斜邊的平方
- (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);
}

//根據(jù)兩個(gè)圓設(shè)置一個(gè)不規(guī)的路徑
- (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;

}


//清空高亮狀態(tài)
-(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在顯示時(shí)不要把Autoresizing轉(zhuǎn)成自動(dòng)布局
 self.view.translatesAutoresizingMaskIntoConstraints = NO;
}


@end

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

相關(guān)文章

  • iOS之單獨(dú)使用UISearchBar創(chuàng)建搜索框的示例

    iOS之單獨(dú)使用UISearchBar創(chuàng)建搜索框的示例

    本篇文章主要介紹了iOS之單獨(dú)使用UISearchBar創(chuàng)建搜索框的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • 利用iOS實(shí)現(xiàn)系統(tǒng)相冊大圖瀏覽功能詳解

    利用iOS實(shí)現(xiàn)系統(tǒng)相冊大圖瀏覽功能詳解

    查看大圖是們?nèi)粘i_發(fā)中經(jīng)常會遇到的一個(gè)需求,下面這篇文章主要給大家介紹了關(guān)于利用iOS實(shí)現(xiàn)系統(tǒng)相冊大圖瀏覽功能的相關(guān)資料,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面來一起看看吧。
    2017-09-09
  • ios可拖動(dòng)按鈕實(shí)例

    ios可拖動(dòng)按鈕實(shí)例

    下面小編就為大家分享一篇ios可拖動(dòng)按鈕實(shí)例。具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • IOS開發(fā)用戶登錄注冊模塊所遇到的問題

    IOS開發(fā)用戶登錄注冊模塊所遇到的問題

    最近和另外一位同事負(fù)責(zé)公司登錄和用戶中心模塊的開發(fā)工作。通過本文給大家分享IOS開發(fā)用戶登錄注冊模塊所遇到的問題,感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • IOS多線程實(shí)現(xiàn)多圖片下載(二)

    IOS多線程實(shí)現(xiàn)多圖片下載(二)

    這篇文章主要介紹了IOS多線程實(shí)現(xiàn)多圖片下載(二)的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • IOS開發(fā)之字典轉(zhuǎn)字符串的實(shí)例詳解

    IOS開發(fā)之字典轉(zhuǎn)字符串的實(shí)例詳解

    這篇文章主要介紹了IOS開發(fā)之字典轉(zhuǎn)字符串的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握這樣的方法,需要的朋友可以參考下
    2017-10-10
  • iOS中定位當(dāng)前位置坐標(biāo)及轉(zhuǎn)換為火星坐標(biāo)的方法

    iOS中定位當(dāng)前位置坐標(biāo)及轉(zhuǎn)換為火星坐標(biāo)的方法

    這篇文章主要介紹了iOS中獲取當(dāng)前位置坐標(biāo)及轉(zhuǎn)換為火星坐標(biāo)的方法,這里的火星坐標(biāo)指的是我國專門研制的一種加密的坐標(biāo)系統(tǒng)...需要的朋友可以參考下
    2016-02-02
  • iOS源碼閱讀必備知識之Tagged Pointer

    iOS源碼閱讀必備知識之Tagged Pointer

    這篇文章主要給大家介紹了關(guān)于iOS源碼閱讀必備知識之Tagged Pointer的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • IO實(shí)現(xiàn)計(jì)算器功能

    IO實(shí)現(xiàn)計(jì)算器功能

    這篇文章主要為大家詳細(xì)介紹了IOS基礎(chǔ)之計(jì)算器的編寫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • iOS AFNetworking各種功能封裝類代碼

    iOS AFNetworking各種功能封裝類代碼

    下面小編就為大家分享一篇iOS AFNetworking各種功能封裝類代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01

最新評論