iOS学习笔记(三十四)————手势与touch事件

/ 0评 / 0

touch事件

一个view是否可以处理触摸事件,是根据这个view类的内部是否实现了touch方法来决定的。
触摸事件的传递
当手指触摸到屏幕上的一个view时,系统内部会判断它是否可以处理这个触摸事件,如果能够处理,就自己处理,不在往下传递;如果自己处理不了,就往下传递,如果将要处理触摸事件的view 正好是视图控制器自带的view(self.view),那么就把这个事件交给视图控制器来处理。
主要涉及下面四个方法,之前我们也见过:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"began");
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"move");
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"end");
}

// 由于系统的原因,触摸事件被取消了,会调用这个方法
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"cancel");
}

手势

常用的手势有六种, 滑动pan 捏合pinch 旋转rotation 长按longpress 点击tap 轻扫swipe,来看一下我在自定义 view 中写的手势例子

- (id)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self){
        // 6种手势
        // 滑动pan 捏合pinch 旋转rotation 长按longpress 点击tap 轻扫swipe
        
        // 创建手势识别器
        UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
        // 手势要求最少几个手指
        //        panGesture.minimumNumberOfTouches = 2;
        // 把手势识别器添加给view
        [self addGestureRecognizer:panGesture];
        
        // 捏合
        UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)];
        [self addGestureRecognizer:pinchGesture];
        
        // 旋转
        UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotation:)];
        rotationGesture.delegate = self;
        [self addGestureRecognizer:rotationGesture];
        
        // 长按
        UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
        [self addGestureRecognizer:longPressGesture];
        
        // tap
        //        UITapGestureRecognizer
        
    }
    return self;
}

- (void)pan:(UIPanGestureRecognizer *)recognizer{
    CGPoint point = [recognizer translationInView:[self superview]];
    NSLog(@"pan  %@",NSStringFromCGPoint(point));
    
    // view的中心点
    CGPoint center = self.center;
    
    center.x += point.x;
    center.y += point.y;
    
    self.center = center;
    
    // 每次获取到手势中滑动的距离,然后把这个距离让view移动,移动之后把距离清零
    [recognizer setTranslation:CGPointZero inView:[self superview]];
    
}

- (void)pinch:(UIPinchGestureRecognizer *)recognizer{
    NSLog(@"scale  %f",recognizer.scale);
    
    // 每一次当上一次的基础上 去改变刻度
    self.transform = CGAffineTransformScale(self.transform, recognizer.scale, recognizer.scale);
    
    // 缩放之后 重置刻度
    recognizer.scale = 1;
    
}

- (void)rotation:(UIRotationGestureRecognizer *)recognizer{
    NSLog(@"rotation  %f",recognizer.rotation);
    
    self.transform = CGAffineTransformRotate(self.transform, recognizer.rotation);
    
    recognizer.rotation = 0;
}



- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    return YES;
}

- (void)longPress:(UILongPressGestureRecognizer *)recognizer{
    if (recognizer.state == UIGestureRecognizerStateBegan){
        NSLog(@"longpress");
        
        UIMenuController *menuController = [UIMenuController sharedMenuController];
        
        UIMenuItem *item = [[UIMenuItem alloc] initWithTitle:@"重置" action:@selector(reset)];
        UIMenuItem *item1 = [[UIMenuItem alloc] initWithTitle:@"复制" action:@selector(copyString)];
        
        menuController.menuItems = @[item,item1];
        
        // 获取长按的点
        CGPoint point = [recognizer locationInView:self];
        
        // 绑定位置
        [menuController setTargetRect:CGRectMake(point.x, point.y, 0, 0) inView:self];
        // 让它显示
        [menuController setMenuVisible:YES animated:YES];
        
        // 让当前的view成为第一响应
        [self becomeFirstResponder];
        
    }
    
}

- (void)reset{
    NSLog(@"reset");
    
    [UIView animateWithDuration:0.3 animations:^{
         self.center = CGPointMake(160, 240);
         // 回到默认的状态
         self.transform = CGAffineTransformIdentity;
     }];
}

- (void)copyString{
    NSLog(@"copyString");
    
    // 通过代码的方式 往系统内部的粘贴板中 复制东西
    UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];
    pasteBoard.string = @"手势手势";
}

- (BOOL)canBecomeFirstResponder{
    return YES;
}

代码请查看 http://git.oschina.net/zcb1603999/LearningiOS

评论已关闭。