一、我们来做这个愤怒的小方块啊, 1.我们新建一个项目, Name:18-愤怒的小方块, Dynamic,不能够处理圆形的View,Dynamic都是方的,如果你想处理圆的View的话,需要用另外一个东西,什么Kit,专门做游戏的一个iOS框架, 首先,我们把这个项目的竖屏,去掉勾选,只留一个Landscape Left, 2.接下来,我们去创建一个UIView,一个红色的View,先让它一拖拽,能够飞起来,再去考虑蓝色的View,碰撞的问题, 这个思路,大概是这个样子的,首先,有一个拖拽的手势, 超出了一个圆形的范围以后,它就不能够再拖拽了, 我之前跟大家说的那个CGPath包含某一个点,它超过某一个圆形的区域,就不能够再拖拽了,如果你在圆形的区域里边撒手的话,看一下我手指的这个位置,跟你这个View一开始的中心,我这儿加了一个小黑点儿,看着方便一些,跟我中间的这个距离,是多少,然后我的推力也会依次的变大, 这个红色的View,本身带一个重力,到时候你往外扔的时候,它会自动的落下来, 还有这个方向的问题,也是算一个偏移量,把它用向量的形式取一个反,让它往反方向去推,推完了以后,再带一个重力,它就会落下来, 3.// 添加小鸟 UIView *bird = [[UIView alloc] init]; bird.frame = CGRectMake(150,250,30,30); bird.backgroundColor = [UIColor redColor]; [self.view addSubview:bird]; command + R, 4.我要去拖拽这个红色的View, 我要去给这个红色的View添加一个手势, // 为小鸟添加一个拖拽的手势 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc ] initWithTarget:self action:@selector(pan:)]; 接下来,去添加,给这个View添加, [bird addGestureRecognizer:pan]; 5.// 实现小鸟拖拽的方法 - (void)pan:(UIPanGestureRecognizer *)sender{ } 我直接改它的Transform, 之前讲拖拽手势,不是有一个图片吗,图片我们直接通过它的translate有一个方法,可以拿到它每一次的偏移量,然后,这个偏移量,只是在它自身、红色View的translate基础上去累加,去加这个偏移量,然后,最后不要忘了那个归零的操作, 1)// 获取移动的偏移量 [sender translationInView:sender.view]; 看看这个View到底移动了多少, 写一个CGPoint offset = [sender translationInView:sender.view]; 然后呢,这个偏移量有了以后,我们再去把它,改变一下transform, // 改变红色View的transform 然后,红色的View,在这儿怎么样去拿,self.bird?sender.view,是不是也是一样的, 在这儿你可以搞一个全局的,或者sender.view,也是一样的, 我们是在累加,所以,不要用Make, 不用Make的话,会有问题,你再清一个零,问题就解决了, sender.view.transform = CGAffineTransform sender.view.transform = CGAffineTransform(sender.view.transform,offset.x,offset.y); // 归0 [sender setTranslation:CGPointZero inView:sender.view]; command + R, 拖拽搞定, 6.如果超出了以之前的View.center,半径是100的范围,那就不让你再去拖拽了,你就直接在这个pan:方法里边,return,就完了, 首先啊,我这个距离,应该怎么着去计算, 首先,红色View的Center是有的,然后呢,我现在偏移量,我也是可以求出来的, 就是我当前新的手指的位置,肯定也会获取到的, 我获取到以后,就可以去计算出来,我这个当前手指的位置,跟我之前这个红色View的Center,的偏移量, 那有了这个偏移量,我要算它们两个的距离,怎么算, 对,勾股定理嘛,勾三、股四、玄五, 假设,红色的View之前在这儿,然后,我把它拖到了黄色方块儿的位置,我可以计算出之前红色View的Center,和我这个黄色方块儿的Center之间的偏移量,这两个黄色箭头的距离,可以算出来, 我现在要求的是,这个距离, 能算出来吧,对吧,它的平方 + 它的平方,再开方, 就可以了吧, 接下来,我们去计算这个距离,那计算距离之前呢,我要有偏移量, 有X变了多少,Y变了多少, 那么,这个offset,能用吗,不能吧,这是增加量,这个offset我们是一直在归零的, 想想我们之前在讲旋转的时候,我们直接输出的话,是从0开始,一点儿一点儿的去累加,如果我们归零了以后,是不是只是在去输出它的夹角, 实际上,当前的这个偏移量,也是一样的,它输出的应该就是0啊,1啊,这些, 输出一下试试: NSLog(@“%@”,NSStringFromCGPoint(offset)); 实际上,它输出的,只是我每一次拖动的增量, 也就是0、1、2、3、4、5啊,也就这么大了,除非我拖的很快, 反正它这个offset,肯定是不能用的, 它不是一共拖了多少,而是每一次,跟上一次相比,拖了多少, 那这个时候,怎么办,累加,累加是不是还要保存啊,有没有别的办法, 好,我们说,我们之前在用touchBegan:touchMove:的时候,我们调用的获取手指的位置,叫做locationInView: 然后呢,这个方法叫什么,translationInView: Translation是什么,是你移动了多少, sender里边还有一个locationInView: 这个locationInView: