关于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
关于longPressGesture做一个长按连加的效果(原创)的更多相关文章
- ajax一个很好的加载效果
推荐一个常用的jquery加载效果插件: 要引入这个插件的css和js: <link href="<%=path %>/css/showLoading.css" ...
- css3加js做一个简单的3D行星运转效果
前几天在园子里看到一篇关于CSS3D行星运转的文章,原文在这里,感觉这个效果也太酷炫了,于是自己也就心血来潮的来尝试的做了一下.因为懒得去用什么插件了,于是就原生的JS写,效果有点粗超,还有一些地方处 ...
- 做一个360度看车的效果玩玩(web)
前几天在 Lexus 官网看到有这样的一个效果:http://www.lexus.com.cn/models/es/360 于是顺手打开控制台看了下他们是怎么做的,发现使用的技术还是比较简单的,通过背 ...
- CSS3一个酷炫的加载效果
上效果图,用截屏工具制作的,看起来有点卡,在网页上面显示还是不错的. CSS代码: <style type="text/css"> .loader{ position: ...
- 做一个阅读管理APP
背景 由于最近在看的书有点多,所以一直想找一个能够管理阅读进度的书(鄙人记性不是很好,两天不看就忘了)可惜Android平台上一直找不到合适的APP: 有没有读书进度管理的网站或软件啊? 有没有记录读 ...
- 用Django加PIL做一个证件照模板生成器网页
最近在整理自己的简历,发现简历上面的ID照有些太老了,所以就准备重新准备一些证件照,刚好最近在弄自己的博客网站,想着直接做一个网页工具出来,直接生成证件照模板,这样还可以省去PS的麻烦.而且照片涉及到 ...
- HttpAsyncClient 做并发长连接的一个实例
HttpAsyncClient 做并发长连接的一个实例 import java.util.concurrent.CountDownLatch; import org.apache.http.HttpR ...
- ios之申请后台延时执行和做一个假后台的方法(系统进入长时间后台后,再进入前台部分功能不能实现)
转自:http://sis hu ok.com/forum/blogCategory/showByCategory.html?categories_id=138&user_id=10385 ...
- 使用RequireJS并实现一个自己的模块加载器 (一)
RequireJS & SeaJS 在 模块化开发 开发以前,都是直接在页面上引入 script 标签来引用脚本的,当项目变得比较复杂,就会带来很多问题. JS项目中的依赖只有通过引入JS的顺 ...
随机推荐
- unity getcomponentsinchildren 翻船
今天使用GetComponentsInChildren, 老司机翻船.因为一直以来我使用这个函数,下意识的从来所有的相同component都是放在子节点下,本身节点肯定不会放一个相同的componen ...
- python简单分布式demo
A服务器是master,B服务器为worker, A服务器上执行taskManger.py # coding:utf-8 import random,time,Queue from multiproc ...
- 使用CefSharp开发一个12306“安心刷票弹窗通知”工具
有需求就要改进 最近两年没有在春节回家过年了,主要是票太难买,虽然之前写了一个12306“无声购票弹窗”工具,解决了抢票问题,但是全家老小一起回去还是很累,干脆就在北京过年了.这两天突然有一个朋友问我 ...
- python中math模块常用的方法整理
ceil:取大于等于x的最小的整数值,如果x是一个整数,则返回x copysign:把y的正负号加到x前面,可以使用0 cos:求x的余弦,x必须是弧度 degrees:把x从弧度转换成角度 e:表示 ...
- 从返回的HTTP Header信息中隐藏Apache的版本号及PHP的X-Powered-By信息
默认情况下,很多apache安装时会显示版本号及操作系统版本,甚至会显示服务器上安装的是什么样的apache模块.这些信息可以为黑客所用,并且黑客还可以从中得知你所配置的服务器上的很多设置都是默认状态 ...
- linux中sed在指定字符前后添加内容
假设文档内容如下: [root@localhost ~]# cat /tmp/input.txt null 000011112222 test 要求:在1111之前添加AAA,方法如下: sed ...
- BZOJ 1593: [Usaco2008 Feb]Hotel 旅馆 [线段树]
传送门 题意: 操作1:找长为$len$的空区间并填满,没有输出$0$ 操作2:将$[l,r]$之间的区间置空 我真是太弱了这种线段树还写了一个半小时,中间为了查错手动模拟了$30min$线段树操作, ...
- c++中对于json的key不带双引号的问题修复
在引用了第三方数据时,数据源通过转义,将json的key上双引号给去掉了. 在PHP开发时,可以通过正则表达式替换方式来补充丢失的双引号,处理代码如下 function ex_json_decode( ...
- Android开发之漫漫长途 XIV——RecyclerView
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- WPF项目学习.二
WPF用MVVM的解决记录 版权声明:本文为博主初学经验,未经博主允许不得转载. 一.前言 记录在学习与制作WPF过程中遇到的解决方案. 焦点的控制,键盘事件触发,输入框的数字限制,异步处理,隐藏状 ...