zoukankan      html  css  js  c++  java
  • basicAnimation移动图形

    目的:采用CABasicAnimation  点击屏幕上的点来是实现图像的位置移动  并且位置能够不反弹

        

        难点:1 通过动画的KeyPath找到layer的属性

                2 通过NSValue将点包装成对象 (下一点toValue的位置  对真正视图的改变)

                    包装的时候是【NSValue valueWithPoint】

                  取值的时候是【toValue CGPoint】;

    注意点:当图像移动了 其实真正的涂层是没有移动的 要想让它真正的发生改变 一般在动画之后做一些具体的移动位置之类的操作

    效果图:

     

    具体实现代码

    viewController.m

    @interface ViewController ()
    @property(nonatomic,strong)CALayer *subLayer;
    @end
    
    [super viewDidLoad];
        //子层的设置 并加入到跟层中
        
        _subLayer = [[CALayer alloc]init];
        _subLayer.backgroundColor = [[UIColor redColor]CGColor];
        _subLayer.bounds = CGRectMake(0, 0, 100, 100);
        _subLayer.position = CGPointMake(100, 100);
        _subLayer.cornerRadius = 50;
        
        [self.view.layer addSublayer:self.subLayer];
        
        //创建一个手势
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap:)];
        
        //设置几根手指点  点几次
        tap.numberOfTouchesRequired = 1;
        tap.numberOfTapsRequired = 1;
        
        //给view添加手势
        [self.view addGestureRecognizer:tap ];
    

    /*

     基础动画关注的知识两个点  第一个点不设置的话就是当前点  有属性toValue表示下一点(目的点)

     还有就是一定要记得给动画设置代理

     */

    实现手势的代码:

    -(void)tap:(UITapGestureRecognizer*)sender
    {
        /*找到点击点 然后将点击点设置成 动画的toValue*/
        CGPoint location = [sender locationInView:self.view];
        //创建动画 并设置其属性
        CABasicAnimation *basic = [[CABasicAnimation alloc]init];
        //动画时间 和 keyPath
        basic.duration = 3.0f;
        basic.keyPath = @"position";
        
        //将下一点进行封装后 赋值给basic的下一点
        NSValue *mytoValue = [NSValue valueWithCGPoint:location];
        basic.toValue = mytoValue;
        //设置能够呆在最后的位置不动
        basic.removedOnCompletion = NO;
        basic.fillMode = kCAFillModeForwards;
        
        //给动画添加代理(很重要)
        basic.delegate = self;
        
        //将动画添加给subLayer
        [self.subLayer addAnimation:basic forKey:@"basic"];
        
    }
    

     代理动画的方法:

    -(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
    {
        NSValue *toValue = ((CABasicAnimation*)anim).toValue;
        self.subLayer.position = [toValue CGPointValue];
    }
    
    对上述的代码,有任何疑问,可以在下方留言。 也可以给我发邮件咨询:673658917@qq.com 或者是直接加qq:673658917 转载请注明出处,谢谢合作。 睡觉舒服,那是给死人准备的,加油吧,一年后你会感谢现在的自己的。
  • 相关阅读:
    struct resbuf 结构就象LISP里面的表(
    CString互转int
    C++中std::sort/std::stable_sort/std::partial_sort的区别及使用
    *ARX对数据的类型和单位进行转换
    c++常见容器操作
    C++中const关键字的使用方法,烦透了一遍一遍的搜,总结一下,加深印象!!!
    ARX 简单程序(不错的例子)
    ARX对象的一些文字说明
    CAD ObjectARX扩展工具的源码(一)
    CAD ObjectARX扩展工具的源码(三)
  • 原文地址:https://www.cnblogs.com/lishanshan/p/4883608.html
Copyright © 2011-2022 走看看