UIEvent UIResponder UI_04

1、事件(UIEvent),是由硬件设备捕捉到用户对设备的操作,把这个操作抽象成一个事件对象
    ios中三大事件:触 Touches 摸晃动事件Motion,远程控制事件RemoteControl其中应有最广泛的是触摸事件
UIView是支持触摸的,由于UIView 内部没有实现跟触摸相关的方法,所以我们再点击UIView创建其子类进行方法实现
2、一般准备做题思路:先在 AppDelegate.m中建立一个 TouchVC对象
TouchViewController *touchVC = [[TouchViewController alloc]init];
    
//将touchVC指定self.window的为根视图控制器
    
self.window.rootViewController = touchVC;
    [touchVC release];
然后在 TouchViewController.m中设置颜色
self.view.backgroundColor = [UIColor yellowColor];
————————————————————————————
以上方法为通常准备方法:
第一类型:点击移动视图
     MoveView *moveView = [[MoveView alloc]initWithFrame:CGRectMake(110, 234, 100, 100)];
     moveView.backgroundColor = [UIColor blackColor];
     [self.view addSubview:moveView];
     [moveView release];
第二类型:捏合视图对象
    PinchView *pinchView = [[PinchView alloc]initWithFrame:CGRectMake(60184200200)];
    pinchView.
backgroundColor = [UIColor orangeColor];
    [
self.view addSubview:pinchView];
    [pinchView release];
————————————————————————————
首先总结点击移动视图:
TouchView.m
//如果想让一个视图对象对触摸事件作出反应,需要在这个类中的.m文件中实现跟触摸相关一些方法
//当手指在视图范围内移动的时候触发
- (
void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
//        self.backgroundColor = [UIColor randomColor];
    
self.center = CGPointMake(arc4random_uniform(220 - 100 + 1) + 100arc4random_uniform(468 - 100 +1) +100);
    
//取出手指对像
    
UITouch *f = [touches anyObject];
    
//当前手指的 位置
    
CGPoint location = [f locationInView:self];
    
//之前手指位置
    
CGPoint previousLocation = [f previousLocationInView:self];
    
CGPoint center = self.center;
    
CGFloat dx = location.x - previousLocation.x;
    
CGFloat dy = location.y - previousLocation.y;
    
self.center = CGPointMake(center.x + dx, center.y + dy);
    NSLog(@"%s",__FUNCTION__);
TouchView.m
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    
   
//1.获取手指对象
    
UITouch *finger = [touches anyObject];
    //2.获取手指当前在自身视图的位置
    CGPoint currentLocation = [finger locationInView:self];
    //3.获取手指之前在视图上的位置
    CGPoint  previousLocation = [finger previousLocationInView:self];
    //4.计算手指在x轴和y轴上的增量
    
//手指在x轴上的增量

    
CGFloat dx = currentLocation.x - previousLocation.x;
        
//手指在y轴上的增量
    CGFloat dy = currentLocation.y - previousLocation.y;
    //获取中心点,之前center的位置
    
CGPoint center = self.center;
    
self.center = CGPointMake(center.x + dx, center.y + dy);
}
@end
UIEvent <wbr>UIResponder <wbr>UI_04

——————————————————————————————————————————
第二种类型捏合视图对象:
首先要把默认的单触点关掉
PinchView.m  继承自UIView
-(instancetype)initWithFrame:(CGRect)frame{
    
if (self = [super initWithFrame:frame]) {
        
//ios支持多点触摸,只是默认是单点触摸
        
self.multipleTouchEnabled = YES;
    }
    
return self;
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    
    
//如果集合中touch集合中手指对象个数为1,就直接返回touchsMoved方法
    
if (1 == touches.count) {
        
return;//结束方法
    }
else{
        
//得到集合中所有手指对象,并使用数组存储(数组有序)
    NSArray *allTouchs = [touches allObjects];
        //取出两个触点
        UITouch *touch1 = [allTouchs firstObject];
        
UITouch *touch2 = [allTouchs lastObject];
        
//求出两个手指对象当前的位置
        
CGPoint  firstTouch1 = [touch1 locationInView:self];
        
CGPoint secondTouch2 = [touch2 locationInViewself];
    
//求出当前两个手指的间距
        
CGFloat currentDistance = [self distanceFromeFirstPoint:firstTouch1 secondPoint:secondTouch2];
        
//求出之前两个手指的位置
        
CGPoint previousFirstPoint = [touch1 previousLocationInView:self];
        
CGPoint previousSecondPoint = [touch2 previousLocationInView:self];
        
//求出之前两个点的距离
        CGFloat previousDistance = [self distanceFromeFirstPoint:previousFirstPoint secondPoint:previousSecondPoint];
        //获取捏合前后两个手指间距的比例
        
CGFloat rate = currentDistance / previousDistance;
        
//缩放视图,如果视图的大小发生变化时,而中心点的位置不发生变化,修改bounds就可以了
        
self.bounds = CGRectMake(00self.bounds.size.width * rate, self.bounds.size.height * rate);
    }
}

//封装一个计算距离的方法(sqrt求开方)
- (
CGFloat)distanceFromeFirstPoint : (CGPoint)firstPoint  secondPoint : (CGPoint)secondPoint{
    
CGFloat dx = firstPoint.x - secondPoint.x;
    
CGFloat dy = firstPoint.y - secondPoint.y;
    
//当前两点距离
    
return  sqrt(dx * dx + dy * dy);
}
UIEvent <wbr>UIResponder <wbr>UI_04

================================================================================
响应者链:
AppDelegate.m
//创建 Responder对象
    ResponderViewController *responderVC = [[ResponderViewController alloc]init];
    //将responderVC指定为根控制器
    
self . window . rootViewController  = responderVC;
    [responderVC release];
ResponderViewController.m
1、  UIResponder 响应者类,继承自NSObject,它是一个响应者的基类,它提供了一些处理事件的方法
//什么是响应者(响应者对象):1.继承自UIResponder 2.能对ios事件中(触摸事件,晃动事件,远程事件)做出响应的对象就叫做响应者
// UILabel ,UIImageView  默认用户交互是关闭的
响应者链:确定事件作用的对象时,UIAppcation --->UIAppcationDelegate--->window--->视图控制器--->视图控制器上的子视图
响应事件:(有大到小)视图控制器上的子视图--->视图控制器--->window--->UIAppcationDelegate---UIAppcation  如果都不处理这个事件,事件就会被丢弃
ResponderView.m
   ResponderView *redView = [[ResponderView alloc]initWithFrame:[UIScreenmainScreen].bounds];
    redView.
tag = 101;
    redView.
userInteractionEnabled = NO;
    redView.
backgroundColor = [UIColor redColor];
    [
self.view addSubview:redView];
    [redView 
release];
 
    ResponderView *yellowView = [[ResponderView alloc]initWithFrame:CGRectMake(30360320284)];
    yellowView.
tag = 102;
    
//关闭用户的交互造成响应者链就到这个位置断开了,事件只能找他的上一级处理,如果上一级都不处理,此事件就不了了之了
    yellowView.
userInteractionEnabled = YES;
    yellowView.
backgroundColor = [UIColor yellowColor];
    [redView 
addSubview:yellowView];
    [yellowView 
release];
    
    
    
ResponderView *greenView = [[ResponderView alloc]initWithFrame:CGRectMake(2020280244)];
    greenView.
tag = 103;
    greenView.
backgroundColor = [UIColor greenColor];
    [yellowView 
addSubview:greenView];
    [greenView 
release];
    
    
ResponderView *blueView = [[ResponderView alloc]initWithFrame:CGRectMake(2020240204)];
    blueView.
tag = 104;
    blueView.
backgroundColor = [UIColor blueColor];
    [greenView 
addSubview:blueView];
    [blueView release];
}
ResponderView.m
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    switch (self.tag) {
        
case 101:
            
NSLog(@"红色视图");
            
break;
            
case 102:
            
NSLog(@"黄色视图");
            
break;
            
case 103:
            
NSLog(@"绿色视图");
            
break;
            
case 104:
            
NSLog(@"蓝色视图");
            
break;
        
default:
            
break;
    }
==============================================
欢迎学习本文,未经博主许可,禁止转载!

你可能感兴趣的:(UIEvent UIResponder UI_04)