iOS开发UIkit动力学UIDynamicAnimator一系列动画

UIDynamicAnimator类,通过这个类中的不同行为来实现一些动态特性。

UIAttachmentBehavior(吸附),UICollisionBehavior(碰撞),UIGravityBehavior(重力),UIPushBehavior(推动),UISnapBehavior(捕捉)。另外还有一个辅助的行为UIDynamicItemBehavior,用来在item层级设定一些参数,比如item的摩擦,阻力,角阻力,弹性密度和可允许的旋转等等。

1.UIAttachmentBehavior(吸附):

- (void)viewDidLoad {
    [super viewDidLoad];

    self.dynamicAnimation = [[UIDynamicAnimator alloc]initWithReferenceView:self.view];
    // 图片
    self.imgView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100,100)];
    self.imgView.image = [UIImage imageNamed:@"dizhijieyong_icon"];
    [self.view addSubview:self.imgView];
    self.imgView.userInteractionEnabled = YES;

    // 添加手势
    UIPanGestureRecognizer *panGest = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGestAction:)];
    [self.imgView addGestureRecognizer:panGest];

    // 吸附 offset可以设置吸附的偏移,anchor是设置锚点
    self.attachment = [[UIAttachmentBehavior alloc]initWithItem:self.imgView offsetFromCenter:UIOffsetMake(100, 120) attachedToAnchor:CGPointMake(100, 100)];
}

// 实现一个pan手势,让一个image跟着手势跑

- (void)panGestAction: (UIPanGestureRecognizer *)panGest{

    NSLog(@"手势触发啦!!!");

    // 取得location
    CGPoint location = [panGest locationInView:self.view];
    CGPoint boxLocation = [panGest locationInView:self.imgView];

    switch (panGest.state) {
            // 开始拖拽
        case UIGestureRecognizerStateBegan:

            NSLog(@"you touch started position %@",NSStringFromCGPoint(location));
            NSLog(@"location in image started is %@",NSStringFromCGPoint(boxLocation));
            // 移除
            [self.dynamicAnimation removeAllBehaviors];

            UIOffset offSet = UIOffsetMake(boxLocation.x - CGRectGetMidX(self.imgView.bounds),
                                           boxLocation.y - CGRectGetMidY(self.imgView.bounds));

            self.attachment = [[UIAttachmentBehavior alloc]initWithItem:self.imgView offsetFromCenter:offSet attachedToAnchor:location];
            self.attachment.damping=0.5;
            self.attachment.frequency=0.8;
            [self.dynamicAnimation addBehavior:self.attachment];
            break;
         case UIGestureRecognizerStateEnded:
            [self.dynamicAnimation removeAllBehaviors];
        default:
            [self.attachment setAnchorPoint:location];
            break;
    }
}

2.UIGravityBehavior(重力):

// 实现点击屏幕掉落一张图片的代码

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    self.gravity = [[UIGravityBehavior alloc]initWithItems:nil];
    [self.dynamicAnimation addBehavior:self.gravity];

    UIImageView *gravImagView = [[UIImageView alloc]initWithFrame:CGRectMake(50, 50, 50, 50)];
    gravImagView.image = [UIImage imageNamed:@"zichanlingyong_icon"];
    [self.view addSubview:gravImagView];
    gravImagView.frame = CGRectMake(100, 100, 100, 100);
    [self.gravity addItem:gravImagView];

}

3.UISnapBehavior(捕捉):

// UISnapBehavior 将UIView通过动画吸附到某个点上
- (void) handleTap:(UITapGestureRecognizer *)paramTap{
    CGPoint tapPoint = [paramTap locationInView:self.view];

    if (self.snap != nil){
        [self.dynamicAnimation removeBehavior:self.snap];
    }
    self.snap = [[UISnapBehavior alloc] initWithItem:self.imgView snapToPoint:tapPoint];
    self.snap.damping = 0.5f;  //剧列程度
    [self.dynamicAnimation addBehavior:self.snap];
}

还有一些没有试过,有时间补充吧!!!嘻嘻~~~~~

时间: 2024-12-19 16:14:35

iOS开发UIkit动力学UIDynamicAnimator一系列动画的相关文章

IOS开发——UIKit

网上一大堆关于UIKit的详细说明,一般都是混杂着乱七八糟的代码,可读性差,实用性也不用说了,看着就头痛. 还是自己整理了几乎关于UIKit所有的常用API,图文并茂,纯思维导图,不含乱七八糟的代码,关于demo:下载 IOS开发--UIKit,布布扣,bubuko.com

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

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

iOS开发-三种简单的动画设置

[在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView beginAnimations:nil context:nil]; //设置动画时长 [UIView setAnimationDuration:2.0]; self.headImageView.bounds = rect; // commitAnimations,将beginAnimation之后的所有动画提交并生成动画 [UIView commit

【Swift】IOS开发中自定义转场动画

在IOS开发中,我们model另外一个控制器的时候,一般都使用的自定义的转场动画. 其实我们可以自定义一些转场动画.达到不同的转场效果. 步骤如下:(photoBrowser是目标控制器) 1.在源控制器中,设置目标控制器的转场代理为 self 1 //设置Model转场代理 2  photoBrowser.transitioningDelegate = self 2.同时设置目标控制器的model类型 1 //设置Model类型 2 photoBrowser.modalPresentation

ios开发之简单实现loading动画效果

最近有朋友问我类似微信语音播放的喇叭动画和界面图片加载loading界面是怎样实现的,是不是就是一个gif图片呢!我的回答当然是否定了,当然不排除也有人用gif图片啊!下面我就来罗列三种实现loading动画效果的方法. 方法一:使用UIImageView自带的方法来实现,这也是我推荐的实现方法. NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:[UIImage imageNamed:@"1.png"],[

ios开发——实用技术篇&amp;三维旋转动画

三维旋转动画 实现三位旋转动画的方法有很多种,这里介绍三种 一:UIView 1 [UIView animateWithDuration:1.0 animations:^{ 2 self.iconView.layer.transform = CATransform3DMakeRotation(M_PI_2, 0, 1, 0); 3 } completion:^(BOOL finished) { 4 self.iconView.image = [UIImage imageNamed:@"user_

iOS开发--QQ音乐练习,旋转动画的实现,音乐工具类的封装,定时器的使用技巧,SliderBar的事件处理

一.旋转动画的实现 二.音乐工具类的封装 -- 返回所有歌曲,返回当前播放歌曲,设置当前播放歌曲,返回下一首歌曲,返回上一首歌曲方法的实现 头文件 .m文件 1 #import "ChaosMusicTool.h" 2 #import "MJExtension.h" 3 #import "ChaosMusic.h" 4 5 static NSArray *_musics; 6 static ChaosMusic *_playingMusic; 7

ios开发之图层与核心动画一:图层CALayer的认识

#import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIView *redView; @property (weak, nonatomic) IBOutlet UIImageView *imageV; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]

ios开发随笔第二天 简单动画的实现

首先对视图要有一定的了解,这里我就不多介绍了, 先说一种已经基本不用的头尾式动画 首先 设置一个view  UIView * testView = [UIView alloc]init]; 确定位置  self.testView.frame = CGRectMake(0,0,50,50); 开始动画 [ UIView beginAnimations:nil context: nil   ] 设置动画持续时间 [UIView  setAnimationDuration:2.0] 可动画属性数值 s