手势跟动画和递归调用方法的使用

手势和动画和递归调用方法的使用

手势跟动画和递归调用方法的使用

序言:

在iPhone的开发中触摸/触碰的知识里,大多博客介绍的都是静态的画面,,今天我们就以动态画面的例子,来给大家介绍一个动态的手势加动画。。再次,我们有可能会学到好多,有的可能说没什么。。。。这是对于一个人的看法,是否仔细如想了,不说了。我们开始手势加动画的效果实例。。。。


正文:

第一:我们要实现的效果是:当我们的手指在手机屏幕上拖动,其中的图片向你手指方向移动。(图片我们是一个  皮卡丘的图片)

手势跟动画和递归调用方法的使用

对于检测手指是否拖动,我们使用下面该方法

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

第二步:

我们要创建几个实例对象,。。。如下:

 //用于显示图片
    UIImageView*_ZSJImageView;

我们要设置一个BOOL行的参数,来作为 图片是否移动的标准。。。代码如下;

//移动标志
    BOOL  okWalk;

在着,我们还要一个手指触摸的新的当前位置

 //当前手使的位置
    
    CGPoint NowPoint;
    

第三步:我们添加8张图片。。。如下

手势跟动画和递归调用方法的使用手势跟动画和递归调用方法的使用手势跟动画和递归调用方法的使用手势跟动画和递归调用方法的使用手势跟动画和递归调用方法的使用手势跟动画和递归调用方法的使用手势跟动画和递归调用方法的使用手势跟动画和递归调用方法的使用

并在工程里创建8个对象并将其加入数组里,代码日下。

 //实现动画导入两个图片
    UIImage*Image1=[UIImage imageNamed:@"one1"];
    
    UIImage*Image2=[UIImage imageNamed:@"one2"];

    
    UIImage*Image3=[UIImage imageNamed:@"one3"];
    UIImage*Image4=[UIImage imageNamed:@"one4"];
    UIImage*Image5=[UIImage imageNamed:@"one5"];
    UIImage*Image6=[UIImage imageNamed:@"one6"];
    UIImage*Image7=[UIImage imageNamed:@"one7"];
    UIImage*Image8=[UIImage imageNamed:@"one8"];
    
    
    
    
    NSArray*Images=[[NSArray alloc]initWithObjects:Image1,Image2,Image3,Image4,Image5,Image6,Image7,Image8, nil];
    
     
第四步:我们将我们一开始声明的一个对象
_ZSJImageView
初始化并给其添加动画效果。。。。代码如下:

//创建UiimageView 实例化
    _ZSJImageView=[[UIImageView alloc]initWithImage:Image1];
    
    //将动画图片以数值的形式设置到animationImages属性中
    _ZSJImageView.animationImages=Images;
    //每个0.3播放一个
    _ZSJImageView.animationDuration=0.3;

第五步:我们让画面刚进入的时候,为静止的。。。代码如下:

-(void)viewDidDisappear:(BOOL)animated{
    
    [super viewDidDisappear:animated];
    
    
    okWalk=NO;
    
    
}

第六步:我们要获得画面再拖动时的当前位置。。。代码:

//画面拖动时保持当前的位置


-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    
    
    NowPoint=[[touches  anyObject ]locationInView:self.view];

    
    
}

第七步:我们写最关键得代码。。我们要做的是写图片的调用方法。。代码:

//手指在画面上触摸瞬间动画开始,调用图片的移动方法
//okwalk为yes 的时候,图片持续移动

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    
    
    okWalk=YES;
    [_ZSJImageView startAnimating];
    NowPoint=[[touches  anyObject ]locationInView:self.view];
    <span style="color:#FF0000;">[self movefangfa];</span>
    
    
}

图片的移动方式如下,是有
<span style="color:#FF0000;">[self movefangfa];</span>
    
该方法触发,其中,使用了递归调用的方法 来实现,动画的一直在动。。。。代码

//向手指触摸的方向移动
//okWalk 为yes ,以0.3秒调用地柜方法
-(void)movefangfa
{
    
    
    if (!okWalk) {
        return;//如果为NO,就返回一个NIL,不做任何处理
    }
    
    static  const  NSInteger Kmaxinmumstep=8;//每次移动的距离
    
    CGPoint    newpoint =_ZSJImageView.center;//图片的中心
    //下面的是判断手指触摸的是那个地方,,,如  上,下,左,右
    if (Kmaxinmumstep <abs(NowPoint.x-newpoint.x)) {
        if (NowPoint.x>newpoint.x) {
            
            
            
            newpoint.x+=Kmaxinmumstep;
            
        }else{
            
            
            newpoint.x-=Kmaxinmumstep;
        }
    }else{
        
        
        newpoint.x=NowPoint.x;
        
    }
    
    if (Kmaxinmumstep<abs(NowPoint.x-newpoint.y)) {
        
        
        if (NowPoint.y>newpoint.y) {
            
            
            newpoint.y+=Kmaxinmumstep;
        }else{
            
            newpoint.y-=Kmaxinmumstep;
        }
    }else{
        
        
        
        newpoint.y=NowPoint.y;
    }
    
    
    _ZSJImageView.center=newpoint;
    
    
    //此处是使用递归调用的方法
    [self performSelector:@selector(movefangfa)  withObject:nil afterDelay:0.3];
    
    
   
    
}


第八步:我们要控制当手指离开屏幕,图片的效果是,停止,并切,动画停止。。。。。。

//手指脱离画面的时候,动画停止,okWalk为no
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    
    
    okWalk=NO;
    [_ZSJImageView stopAnimating];
    
}

第九部:当我们要放弃触摸的时候,BOOL 为NO,动画停止。。。注意:该方法是在,当手机运行时,突然有电话接入时。。。(好好想想)

//放弃触摸状态后,动画静止 okwalk 为no
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
    
    
    
    okWalk=NO;
    
    [_ZSJImageView stopAnimating];
}


效果展示:

手势跟动画和递归调用方法的使用

手势跟动画和递归调用方法的使用

手势跟动画和递归调用方法的使用

友情快递:

手势跟动画和递归调用方法的使用


touch 的几个触摸方法的调用时间细写

方法 调用时机
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 该方法是在手指开始触摸手机屏幕时调用
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 该方法是在手指触摸完,离手机屏幕时开始调用的
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 该方法在手指触摸手机屏幕后,并且移动的时候调用,在方法-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event之后调用
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 该方法在手机睡眠,或者有电话接入时调用