UIResponder
响应传递方式
首先要找到在链状结构中,最为适合处理事件相应的组件,如果该组件对事件进行到了处理,那么该事件传递(告一段路),如果最为适合相应该事件的组件没有重写(UIResponder方法),那么他会想回找第二适合处理用户相应事件的组件,如果在一个链状结构中没有任何一个组件处理用户的触控事件,那么该事件将被丢弃
UIApplication-Appdelgate->UIWindow->UIViewController->(UIView默认视图)->GPGreenView(UIResponder)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
//当手指触碰到屏幕开始移动触发的事件
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
//UITouch 用户的手指,用户手指触控到屏幕,系统就会自动创建一个UITouch对象,并且在内部记录下来用户,触控的位置
//UITouch对象被存储在 touches中
//1.可以获得手指当前坐标位置
//2.可以获得移动之前的一个位置
UITouch * touch = [touches anyObject];
//参考当前(自己)视图的坐标系,用户的触控位置应该在哪里
CGPoint currentPoint = [touch locationInView:self];
//移动时候的位置
CGPoint prePoint = [touch previousLocationInView:self];
//让视图进行跟随操作
//1.手指在屏幕上移动的差值
//2.让Frame,x,y坐标增加差值范围
//3.更新Frame
CGRect rect = self.frame;
rect.origin.x += currentPoint.x - prePoint.x;
rect.origin.y += currentPoint.y - prePoint.y;
//通过Bounds属性实现跟随
//bounds属性x,y默认都是0,0,但是x,y值是可以发生改变
//bounds 最主要的作用就是,改变当前视图所有子空间相对于自己的位置
//(0,0,w,h)
CGRect tmpBounds = self.bounds;
tmpBounds.origin.x += prePoint.x -currentPoint.x;
tmpBounds.origin.y += prePoint.y - currentPoint.y;
self.bounds = tmpBounds;
}
//当手指移动触碰到屏幕以后触发的事件
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
//当手指触发事件取消后触发的事件(例如:来电话事件优先级比qq优先级高)
- (void)touchesCancle:(NSSet *)thouches withEvent:(UIEvent *)event