007-手势事件

手势事件

ios 手势事件主要有

Recognizer Event
UITapGestureRecognizer 轻拍手势
UISwipeGestureRecognizer 轻扫手势
UILongPressGestureRecognizer 长按手势
UIPanGestureRecognizer 平移手势
UIPinchGestureRecognizer 捏合(缩放)手势
UIRotationGestureRecognizer 旋转手势
UIScreenEdgePanGestureRecognizer 屏幕边缘平移

Tap事件

Tap 事件就是简单的点击事件。

首先放上一个 UIView 用于点击,放上一个 UILabel 作为点击事件的响应,当点击 View 时累计点击次数。要注意 UIView 默认用户交互是关闭的,需要打开才能响应手势事件。

    UIView *tapView = [[UILabel alloc] initWithFrame:CGRectMake(0, screenHeight/2 - 32, screenWidth, 64)];
    tapView.backgroundColor = [UIColor blueColor];
    tapView.userInteractionEnabled = YES;
    [self.view addSubview:tapView];
    
    _tapNumberLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, screenHeight/2 + 32, screenWidth, 32)];
    _tapNumberLabel.textAlignment = NSTextAlignmentCenter;
    [_tapNumberLabel setText:@"tapNumber: 0"];
    [self.view addSubview:_tapNumberLabel];

然后为 label 添加点击事件

    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapEvent)];
    tapRecognizer.numberOfTapsRequired = 1; //轻拍次数
    tapRecognizer.numberOfTouchesRequired = 1;//手指个数
    [tapView addGestureRecognizer:tapRecognizer];

可以看到两个属性

  • numberOfTapsRequired 表示轻拍次数
  • numberOfTouchesRequired 表示轻拍时手指的个数

Swipe 事件

Swipe 事件就是滑动事件。

首先还是添加一个 UIView 作为滑动的对象,然后在 UILabel 上显示滑动方向。

    UIView *swipeView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, screenWidth, screenHeight/2)];
    swipeView.backgroundColor = [UIColor blueColor];
    swipeView.userInteractionEnabled = YES;
    [self.view addSubview:swipeView];
    
    _alertLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, screenHeight/2 + 32, screenWidth, 32)];
    _alertLabel.textAlignment = NSTextAlignmentCenter;
    [self.view addSubview:_alertLabel];

然后添加 Swipe 事件,可以指定滑动方向和滑动手指个数

    UISwipeGestureRecognizer *leftSwipeRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeEvent:)];
    leftSwipeRecognizer.numberOfTouchesRequired = 1; //手指个数
    leftSwipeRecognizer.direction = UISwipeGestureRecognizerDirectionLeft;
    [swipeView addGestureRecognizer: leftSwipeRecognizer];
    
    UISwipeGestureRecognizer *upSwipeRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeEvent:)];
    upSwipeRecognizer.numberOfTouchesRequired = 1; //手指个数
    upSwipeRecognizer.direction = UISwipeGestureRecognizerDirectionUp;
    [swipeView addGestureRecognizer: upSwipeRecognizer];

在响应事件里再根据方向执行不同操作

- (void)swipeEvent:(UISwipeGestureRecognizer *)sender
{
    if (sender.direction == UISwipeGestureRecognizerDirectionUp)
    {
        _alertLabel.text = @"up up";
    }
    if (sender.direction == UISwipeGestureRecognizerDirectionLeft)
    {
        _alertLabel.text = @"left left";
    }
}

LongPress 事件

首先设置布局,与上文一样

    UIView *targetView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, screenWidth, screenHeight/2)];
    targetView.backgroundColor = [UIColor blueColor];
    targetView.userInteractionEnabled = YES;
    [self.view addSubview:targetView];
    
    _alertLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, screenHeight/2 + 32, screenWidth, 32)];
    _alertLabel.textAlignment = NSTextAlignmentCenter;
    [self.view addSubview:_alertLabel];

然后添加事件

    UILongPressGestureRecognizer *longRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressEvent:)];
    longRecognizer.numberOfTouchesRequired = 1; //手指个数
    longRecognizer.numberOfTapsRequired = 1; // 点击次数
    longRecognizer.minimumPressDuration = 0.5; //最小长按时间
    longRecognizer.allowableMovement = 10; //允许移动的距离,但是一旦被识别为长按后,比如长按时间到达最小长按时间以后,则移动不再受到这一属性的限制
    [targetView addGestureRecognizer:longRecognizer];

最后定义响应事件

- (void)longPressEvent:(UILongPressGestureRecognizer *)sender
{
    if (sender.state == UIGestureRecognizerStateBegan)
    {
        NSLog(@"began");
        _alertLabel.text = @"began";
    }
    if (sender.state == UIGestureRecognizerStateEnded)
    {
        NSLog(@"end");
        _alertLabel.text = @"end";
    }
}

这里关于状态 state,是父类 UIGestureRecognizer 的一个枚举,定义如下

typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
    UIGestureRecognizerStatePossible,   // the recognizer has not yet recognized its gesture, but may be evaluating touch events. this is the default state
    
    UIGestureRecognizerStateBegan,      // the recognizer has received touches recognized as the gesture. the action method will be called at the next turn of the run loop
    UIGestureRecognizerStateChanged,    // the recognizer has received touches recognized as a change to the gesture. the action method will be called at the next turn of the run loop
    UIGestureRecognizerStateEnded,      // the recognizer has received touches recognized as the end of the gesture. the action method will be called at the next turn of the run loop and the recognizer will be reset to UIGestureRecognizerStatePossible
    UIGestureRecognizerStateCancelled,  // the recognizer has received touches resulting in the cancellation of the gesture. the action method will be called at the next turn of the run loop. the recognizer will be reset to UIGestureRecognizerStatePossible
    
    UIGestureRecognizerStateFailed,     // the recognizer has received a touch sequence that can not be recognized as the gesture. the action method will not be called and the recognizer will be reset to UIGestureRecognizerStatePossible
    
    // Discrete Gestures – gesture recognizers that recognize a discrete event but do not report changes (for example, a tap) do not transition through the Began and Changed states and can not fail or be cancelled
    UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // the recognizer has received touches recognized as the gesture. the action method will be called at the next turn of the run loop and the recognizer will be reset to UIGestureRecognizerStatePossible
};

其他事件

其他几个事件的基本过程与上面几个类似,具体绑定手势过程如下

    UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panEvent:)];

    UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panEvent:)];

    UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchView:)];

    UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationView:)];
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容