zoukankan      html  css  js  c++  java
  • 关于longPressGesture做一个长按连加的效果(原创)

    关于longPressGesture做一个长按连加的效果


    • 解释一下什么意思呢?就是一个button长按之后其数字的一直累加。朋友们可能看起来很简单,无非就是加一个长按手势(longPressGesture)呗。对想法是对的,确实就是加一个长按手势,那手势方法内部的实现怎么写呢?注意长按手势不是按多长时间就会调用多少次手势处理方法,一般情况下只会掉三次(我说的是正常的情况下),分别是:手势开始,手势改变,手势结束,那么要想进行累加,那么就需要在手势处理的方法里边循环调用累加的方法,接着你就会想到用一个死循环,当手势开始的时候调用,结束的时候让其退出循环,在这个时候你就会发现在问题了,长按之后会不断的累加,之后程序死了,为什么?其实你仔细看一下就会知道,你在主线程里调用了一个死循环,那能不卡死主线程吗?之后有的人就会想,那我把这个死循环放在异步线程里执行不就好了吗?你确定好了吗?朋友们可以试一下,接下来就会出现按着没有反应,那是因为什么?因为你跟新UI的操作没有放在主线程里,那么我们就会想到吧跟新UI的操作放在主线程里执行不就好了吗?事实上不是这样的,当你把更新UI的操作放在主线程里执行之后,又会出现一个问题那就是,按完一次之后会直接奔溃,程序奔溃了,原因是这样的逻辑根本不正确。
    • 上面说了各种尝试,终于找到了解决的办法,我把我的解决办法,说明一下,做一个总结。我们可以加一个NSTimer,并且让这个Timer循环执行累加的方法,而且这样的好处是,我们直接的间隔是由我们自己控制的,我们想累加的快点就可以快点我们想累加的慢点就可以慢点,我们设置一个flag,当手势开始的时候设置为YES,结束的时候设置为NO,根据这个flag当为YES的时候我们开启Timer,当为NO的时候让timer失效,下面贴上代码:(下面是递减的方法,递增方法一样)

    • 添加手势
    UILongPressGestureRecognizer *longPressGuesForMinus = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(minusButtonLongPressed:)];
    longPressGuesForMinus.allowableMovement = 50;
    longPressGuesForMinus.delegate = self;
    [self.minusButton addGestureRecognizer:longPressGuesForMinus];

    • 手势处理方法
    - (void)minusButtonLongPressed:(UILongPressGestureRecognizer *)guesture {
    BOOL flag = YES;
    if (guesture.state == UIGestureRecognizerStateEnded || guesture.state == UIGestureRecognizerStateFailed) {
    flag = NO;
    }
    if (flag) {
    if (!self.timer) {
    ACWeakSelf(self);
    self.timer = [NSTimer scheduledTimerWithTimeInterval:0.2 repeats:YES block:^(NSTimer * _Nonnull timer) {
    [weakSelf minusValueChange];
    }];
    }
    [self.timer fire];
    }
    if (!flag) {
    if (self.timer.isValid) {
    [self.timer invalidate];
    self.timer = nil;
    }
    }

    }

    • 递减方法
    - (void)minusValueChange {
    NSInteger value = [self.guestLabel.text integerValue]-1;
    if (value>0) {
    self.guestLabel.text = [NSString stringWithFormat:@"%ld", value];
    }
    }

    还有一个小知识点:timer的两种创建方式,一种是直接timerWithInterval...一种是scheduledTimerWithInterval,大家知道这两种创建的方式有什么区别吗?
    其实第一种方式创建的是没有加到当前的运行循环,那是什么概念就是这个timer是不会执行的,需要手动加到运行循环里,[[NSRunLoop CurrentRunLoop] addTimer: mode:];
    当然第二种方式创建的就不需要自己加到运行循环里了,创建的时候已经添加到运行循环里了

    scheduledTimerWithTimeInterval

  • 相关阅读:
    u-boot 移植 --->5、友善之臂Tiny210底板王网卡驱动移植
    Linux 驱动框架---驱动中的中断
    Linux 驱动框架---驱动中的并发
    Linux 驱动框架---platform驱动框架
    Linux内核实现透视---软中断&Tasklet
    Linux内核实现透视---硬中断
    u-boot 移植 --->4、Tiny210核心板的DDR初始化下详解
    redis缓存的安装和使用
    ArrayList、LinkedList、Vector的区别
    Java中的IO流系统详解
  • 原文地址:https://www.cnblogs.com/wannaGoBoy/p/6635489.html
Copyright © 2011-2022 走看看