UIDynamic动画

UIDynamic是从iOS7开始引入的技术 属于UIkit框架 可以模拟显示生活中的物理现象 如碰撞 抖动 摆动等

一.使用UIDynamic步骤:

1.创建一个动力效果器UIDynamicAnimator

2.创建动力效果(Behavior)添加到对于的视图上

3.将动力效果添加到动力效果器中

注:必须遵守了UIDynamicItem这个协议才可以使用动力效果,UIView默认已经遵守了UIDynamicItem协议

玩动力效果  如玩电吉他   电吉他有效果器  可以添加各种电子效果

动力效果  也有一个效果器 叫做 动力效果器  里面可以添加 动力效果

电吉他切换效果  会把上一个效果移除

动力效果 也是一样

电吉他可以叠加多个效果

动力效果 也是一样

UIDynamic提供的动力效果

二.重力效果的属性:

UIGravityBehavior:重力效果(设置重力的方向 加速度 让物体(视图)朝着重力方向掉落)

NSArray *items;添加到重力效果中的所有效果作用对象

CGVector gravityDirection;重力方向(是一个二维向量)以左上角为坐标原点 x 负数向左 正数向右  y 负数向上  正数向下  数字越大  重力效果越大

CGFloat angle;重力方向(是一个角度,x轴正方向为0°,顺时针正数,逆时针负数)

CGFloat magnitude;量级(用来控制加速度,1.0代表加速度是1000 points /second²)重力加速度越大 碰撞越厉害

UICollisionBehavior:碰撞效果()可以让物体之间实现碰撞效果, 也可以通过添加边界(boundary)在边界实现碰撞效果

边界相关的方法:

- (void)addBoundaryWithIdentifier:(id <NSCopying>)identifier forPath:(UIBezierPath*)bezierPath; 添加一个贝塞尔曲线路径的边界

- (void)addBoundaryWithIdentifier:(id <NSCopying>)identifier fromPoint:(CGPoint)p1 toPoint:(CGPoint)p2; 通过添加两个点连成的线 作为边界

- (UIBezierPath*)boundaryWithIdentifier:(id <NSCopying>)identifier; 通过ID找到边界路径

- (void)removeBoundaryWithIdentifier:(id <NSCopying>)identifier; 移除ID对应的边界

@property (nonatomic, readonly, copy) NSArray* boundaryIdentifiers; 边界数组

- (void)removeAllBoundaries;移除所有边界

typedef NS_OPTIONS(NSUInteger, UICollisionBehaviorMode) {

UICollisionBehaviorModeItems        = 1 << 0,元素碰撞

UICollisionBehaviorModeBoundaries   = 1 << 1,边界碰撞

UICollisionBehaviorModeEverything   = NSUIntegerMax 全体碰撞

} NS_ENUM_AVAILABLE_IOS(7_0);

碰撞效果的代理方法:

//两个元素相互碰撞

- (void)collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:(id <UIDynamicItem>)item1 withItem:(id <UIDynamicItem>)item2 atPoint:(CGPoint)p;

- (void)collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:(id <UIDynamicItem>)item1 withItem:(id <UIDynamicItem>)item2;

// 视图碰撞边界的时候 触发

- (void)collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:(id <UIDynamicItem>)item withBoundaryIdentifier:(id <NSCopying>)identifier atPoint:(CGPoint)p;

- (void)collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:(id <UIDynamicItem>)item withBoundaryIdentifier:(id <NSCopying>)identifier;

三.具体代码

@interface ViewController ()<UIDynamicAnimatorDelegate,UICollisionBehaviorDelegate>
{
    UIDynamicAnimator * dynamicAnimator;
    UIView * view1;
      UIView * view2;
     UIView * view3;
}

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];
//    动力效果器
    dynamicAnimator = [[UIDynamicAnimator alloc]initWithReferenceView:self.view];
//    self.view 产生动力效果的区域
    dynamicAnimator.delegate = self;
    view1 =[[UIView alloc]initWithFrame:CGRectMake(0,0,90 , 90)];
    view1.center = self.view.center;
    view1.backgroundColor = [UIColor redColor];

    [self.view addSubview:view1];
    view2 =[[UIView alloc]initWithFrame:CGRectMake(0,0,90 , 90)];
    view2.center = CGPointMake(self.view.center.x+100, self.view.center.y+100);
    view2.backgroundColor = [UIColor orangeColor];
    [self.view addSubview:view2];
    view3 =[[UIView alloc]initWithFrame:CGRectMake(0,0,90 , 90)];

    view3.backgroundColor = [UIColor blueColor];
    [self.view addSubview:view3];

   }
#pragma mark -------手指触摸屏幕 添加动力效果--------------------------
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch * touch = [touches anyObject];
    CGPoint touchpoint = [touch locationInView:self.view];
    view1.center = touchpoint;
    view2.center = CGPointMake(self.view.center.x+100, self.view.center.y+100);
      view3.center = CGPointMake(self.view.center.x+10, self.view.center.y+10);
    view1.hidden = NO;
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
//    把之前的动力效果移除
    [dynamicAnimator removeAllBehaviors];
//在View1上添加重力效果
    UIGravityBehavior * gravity = [[UIGravityBehavior alloc]initWithItems:@[view1]];
//    设置加速度
    gravity.magnitude = 100;
//设置动力效果的方向
    gravity.gravityDirection = CGVectorMake(0, 1);
//    添加到效果器 开始动力效果
    [dynamicAnimator addBehavior:gravity];
    UICollisionBehavior * collision = [[UICollisionBehavior alloc]initWithItems:@[view1,view2,view3]];
    collision.collisionDelegate = self;
    collision.translatesReferenceBoundsIntoBoundary = YES;
//    如果设置了 两个元素之间相互碰撞 设置了边界 也就不起作用了
//    collision.collisionMode = UICollisionBehaviorModeItems;
    [dynamicAnimator addBehavior:collision];
#pragma mark----------------动力元素效果----------------------------
//可以与其他的 动力效果 配合使用
    UIDynamicItemBehavior * item = [[UIDynamicItemBehavior alloc]initWithItems:@[view2,view1,view3]];
//    设置元素的跳跃度
    item.elasticity = 0.9;
    [dynamicAnimator addBehavior:item];

}

当然还可以设置边界,当只添加View1时

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
//    把之前的动力效果移除
    [dynamicAnimator removeAllBehaviors];
//在View1上添加重力效果
    UIGravityBehavior * gravity = [[UIGravityBehavior alloc]initWithItems:@[view1]];
//    设置加速度
    gravity.magnitude = 100;
//设置动力效果的方向
    gravity.gravityDirection = CGVectorMake(0, 1);
//    添加到效果器 开始动力效果
    [dynamicAnimator addBehavior:gravity];
#pragma mark ------碰撞效果-----------------------
    UICollisionBehavior * collision = [[UICollisionBehavior alloc]initWithItems:@[view1,view2]];
    collision.collisionDelegate = self;
//    设置一条下斜线边界
//    [collision addBoundaryWithIdentifier:@"line1" fromPoint:CGPointMake(0, 300) toPoint:CGPointMake(400, 600)];
//设置竖直线边界
//    [collision addBoundaryWithIdentifier:@"line2" fromPoint:CGPointMake(300, 0) toPoint:CGPointMake(300, 600)];
//    通过贝瑟尔曲线 画一个圆
    UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 200, 300, 300)];
    [collision addBoundaryWithIdentifier:@"yuan" forPath:path];

//把动力效果器的范围当做边界
    collision.translatesReferenceBoundsIntoBoundary = YES;
    [dynamicAnimator addBehavior:collision];
}
时间: 2024-12-28 01:08:41

UIDynamic动画的相关文章

【iOS开发系列】物理仿真动画UIDynamic (1)

iOS开发拓展篇-UIDynamic(简单介绍) [一]简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 如:重力.弹性碰撞等现象 2.物理引擎的价值 广泛用于游戏开发,经典成功案例是"愤怒的小鸟" 让开发人员可以在远离物理学公式的情况下,实现炫酷的物理仿真效果 提高了游戏开发效率,产生更多优秀好玩的物理仿真游戏 3.知名的2D物理引擎 Box2d Chipmun

UIDynamic

简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 重力.弹性碰撞等现象 物理引擎的价值 广泛用于游戏开发,经典成功案例是“愤怒的小鸟” 让开发人员可以在远离物理学公式的情况下,实现炫酷的物理仿真效果 提高了游戏开发效率,产生更多优秀好玩的物理仿真游戏 知名的2D物理引擎 Box2d Chipmunk 使用步骤 要想使用UIDynamic来实现物理仿真效果,大致的步骤如下 创建一个物

iOS UIDynamic

1.简介 UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 重力.弹性碰撞等现象 UIView默认已经遵守了UIDynamicItem协议,因此任何UI控件都能做物理仿真,UICollectionViewLayoutAttributes类默认也遵守UIDynamicItem协议也能做物理仿真 物理引擎的价值 广泛用于游戏开发,经典成功案例是“愤怒的小鸟” 让开发人员可以在远离物理学公式的情况下,实现炫酷的物理仿真

iOS游戏开发之UIDynamic

iOS游戏开发之UIDynamic 简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象重力.弹性碰撞等现象 物理引擎的价值 广泛用于游戏开发,经典成功案例是“愤怒的小鸟” 让开发人员可以在远离物理学公式的情况下,实现炫酷的物理仿真效果 提高了游戏开发效率,产生更多优秀好玩的物理仿真游戏 知名的2D物理引擎 Box2d Chipmunk 使用步骤 要想使用UIDynamic来实现物理仿

iOS Core Animation Advanced Techniques-基于定时器的动画

上十章节: 图层树 图层的寄宿图 图层几何学 图层视觉效果 图层变换 专用图层 隐式动画 显式动画 图层时间 图层缓冲 这篇随笔主要介绍有关基于定时器的动画. 定时帧: 示范例子://使用NSTimer实现弹性球动画 //add ball image view UIImage *ballImage = [UIImage imageNamed:@"Ball.png"]; self.ballView = [[UIImageView alloc] initWithImage:ballImag

【iOS】UIDynamic

UIDynamic是从iOS 7开始引入的一种新技术,属于UIKit框架.可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象:如重力.弹性碰撞等现象. 一.UIDynamic中的一些概念 三个重要的类: UIDynamicItem Protocol:(要执行仿真动画的对象) To make a custom object eligible to participate in UIKit Dynamics, adopt the UIDynamicItem protocol in the ob

UIDynamic仿物理引擎-浮动碰撞效果-b

最近产品提了个需求(电商的APP-两鲜),需要在APP背景加上几个水果图案在那里无规则缓慢游荡...模仿 天天果园 APP的.好吧,那我就在网上找了很多文章,总结一下写个demo.效果如下: Mou icon 这里用到的是UIDynamic这个类. UIDynamic简介 一.简介 注意:UIKit动力学的引入,并不是为了替代CA或者UIView动画,在绝大多数情况下CA或者UIView动画仍然是最有方案,只有在需要引入逼真的交互设计的时候,才需要使用UIKit动力学它是作为现有交互设计和实现的

iOS进阶 - UIDynamic

一.简单概述 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 ,可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 如:重力.弹性碰撞等现象 其实就是UIKit的一套动画和交互体系.我们现在进行UI动画基本都是使用CoreAnimation或者UIView animations.而UIKit动力学最大的特点是将现实世界动力驱动的动画引入了UIKit,比如重力,铰链连接,碰撞,悬挂等效果.总之就是,将2D物理引擎引入了人UIKit.需

IOS动画实现(1)几种实现方式

最近项目v1顺利收工,v2正在规划当中.有闲做一些预研工作,包括动画方面的,交互设计师强烈要求的,你懂的(囧).在这里也做一下记录. IOS的动画,大约分为如下几种: 1.UIView封装的Animation 2.CoreAnimation(CA) 3.UIDynamic (ios7后才有) 4.最近了解到的有一个叫做Pop的开源库,Facebook出品.git地址在此.https://github.com/facebook/pop 以下会分别展开描述下.