可以触发点击事件并变色的UILabel
可以触发点击事件并变色的UILabel

谁说UILabel不能够当做button处理点击事件呢?今天,笔者就像大家提供一个改造过的,能够触发点击事件并变色的UILabel:)
效果图:

还能当做计时器用囧:

源码如下:
TapLabel.h 与 TapLabel.m
//
// TapLabel.h
// TapLabel
//
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import <UIKit/UIKit.h>
@class TapLabel; @protocol TapLabelDelegate <NSObject>
- (void)tapLabelEvent:(TapLabel *)label;
@end @interface TapLabel : UILabel @property (nonatomic, assign) id<TapLabelDelegate> delegate; // 协议
@property (nonatomic, strong) NSString *notificationName; // 设置通知中心名字
@property (nonatomic, strong) NSDictionary *metaData; // 元数据 @end
//
// TapLabel.m
// TapLabel
//
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import "TapLabel.h" @implementation TapLabel - (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
self.userInteractionEnabled = YES;
UILongPressGestureRecognizer *tap = \
[[UILongPressGestureRecognizer alloc] initWithTarget:self
action:@selector(labelEvent:)];
tap.minimumPressDuration = 0.01f;
[self addGestureRecognizer:tap];
}
return self;
} - (void)labelEvent:(UILongPressGestureRecognizer *)gesture
{
// 获取到坐标值
CGPoint locationPoint = [gesture locationInView:self]; // 状态1
if (gesture.state == UIGestureRecognizerStateBegan)
{
self.highlighted = YES;
} // 状态2
if(gesture.state == UIGestureRecognizerStateChanged)
{
if (locationPoint.x <= self.bounds.size.width && locationPoint.x >= &&
locationPoint.y <= self.bounds.size.height && locationPoint.y >= )
{
self.highlighted = YES;
}
else
{
self.highlighted = NO;
}
} // 状态3
if (gesture.state == UIGestureRecognizerStateEnded)
{
if (locationPoint.x <= self.bounds.size.width && locationPoint.x >= &&
locationPoint.y <= self.bounds.size.height && locationPoint.y >= )
{ if (_delegate) {
[_delegate tapLabelEvent:self];
} if (_notificationName) {
[[NSNotificationCenter defaultCenter] postNotificationName:_notificationName
object:nil
userInfo:@{@"TapLabel": self}];
}
} self.highlighted = NO;
}
} @end
使用时的源码:
//
// RootViewController.m
// TapLabel
//
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import "RootViewController.h"
#import "TapLabel.h" @interface RootViewController ()<TapLabelDelegate> @end @implementation RootViewController - (void)viewDidLoad
{
[super viewDidLoad]; TapLabel *tap = [[TapLabel alloc] initWithFrame:CGRectMake(, , , )];
tap.textAlignment = NSTextAlignmentCenter;
tap.center = self.view.center;
tap.text = @"YouXianMing";
tap.font = [UIFont fontWithName:@"HelveticaNeue-Thin" size:];
tap.delegate = self;
tap.metaData = @{@"name": @"YouXianMing"}; tap.highlightedTextColor = [UIColor redColor];
[self.view addSubview:tap];
} - (void)tapLabelEvent:(TapLabel *)label
{
NSLog(@"%@", label.metaData);
} @end
原理解析:
1. 在初始化的时候后添加了手势处理:

2. 精确计算手势的3种状态

3. UILabel自带了highlightedTextColor:)

原理就是这么简单呢:)
可以触发点击事件并变色的UILabel的更多相关文章
- view.performClick()触发点击事件
1.主要作用 自动触发控件的点击事件 2.界面的布局文件 activity_main.xml <RelativeLayout xmlns:android="http://schema ...
- 解决jQuery ajax动态新增节点无法触发点击事件的问题
在写ajax加载数据的时候发现,后面添加进来的demo节点元素,失去了之前的点击事件.为什么点击事件失效,我们该怎么去解决呢? 其实最简单的方法就是直接在标签中写onclick="" ...
- 解决JavaScript拖动时同时触发点击事件的BUG
在做在线地图项目的时候,在给marker点绑定事件时,因为有点击事件click,同时又存在拖动dragEnd事件,首先没有重大缺陷,就是在用户在点击的时候,有时候本想是点击,但是他触发了drag的事件 ...
- 关于AJAX异步加载节点无法触发点击事件问题的解决方式
做练习的过程中遇到一个问题,使用AJAX异步新增一个节点,无法触发点击事件,经过查阅之后知道一个方式,使用JS的委托事件,在此做一个记录. $(document).on('click', '.recr ...
- JS实现按下按键触发点击事件
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- vue中Enter触发登录事件和javascript中Enter触发点击事件
created(){ window.addEventListener('keydown', this.handleKeyDown, true)//开启监听键盘按下事件 } 在methods中当keyC ...
- Echarts如何添加鼠标点击事件?防止重复触发点击事件
Echarts如何添加鼠标点击事件? 1.通常我们只使用了以下代码,通过配置项和数据显示图表. var myChart = echarts.init(document.getElementById(' ...
- heightcharts点击曲线图获取返回值的问题(ios点击图表第一次无法触发点击事件解决方法)
需求:用的heightcharts插件,点击曲线图想获得所点击点的返回值,如图 问题代码: (function chart_line(){ var data={"title":[& ...
- js中 ajax动态新增节点无法触发点击事件
在写ajax加载数据的时候发现,后面添加进来的demo节点元素,失去了之前的点击事件. 其实最简单的方法就是直接在标签中写onclick="",但是这样写有些场景的是实现不了的,最 ...
随机推荐
- 4-nginx-反向代理到tomcat及负载均衡
反向代理相比于正向代理, 比如使用搬瓦工时, 就是位于客户端的正想代理, 而反向代理则是服务器端的代理, 主要用于实现请求分发, 负载均衡等功能 正向代理推荐一个: 搬瓦工, 比较好用.. 反向代理主 ...
- Linux-(top,free)
top命令 1.命令格式: top [参数] 2.命令功能: 显示当前系统正在执行的进程的相关信息,包括进程ID.内存占用率.CPU占用率等. top命令是Linux下常用的性能分析工具,能够实时显示 ...
- synchronized修饰方法和对象的区别
使用synchronized(object) { 代码块.... } 能对代码块进行加锁,不允许其他线程访问,其的作用原理是:在object内有一个变量,当有线程进入时,判断是否为0,如果为0,表示可 ...
- Linux网络子系统
再Linux的世界里,万物皆文件,通过虚拟文件系统VFS,程序可以用标准的Linux系统调用对不同的文件系统,甚至不同介质上的文件系统进行读写操作.下面我们揭示Linux网络子系统的秘密 sockfs ...
- docker-compose.yml样例(mysql主从+mycat读写分离)
Docker-compose.yml文件示例 1.mysql主从复制的docker-compose.yml文件 # cat docker-compose.yml version: '2' # 这个ve ...
- python线程入门
目录 python线程入门 线程与进程 线程 总结 参考 python线程入门 正常情况下,我们在启动一个程序的时候.这个程序会先启动一个进程,启动之后这个进程会启动起来一个线程.这个线程再去处理事务 ...
- hadoop学习笔记(十一):MapReduce数据类型
一.序列化 1 hadoop自定义了数据类型,在hadoop中,所有的key/value类型必须实现Writable接口.有两个方法,一个是write,一个是readFileds.分别用于读(反序列化 ...
- pageParam要求传个JSON对象的方法
pageParam要求传个JSON对象,使用方式:api.openWin({name: 'page1',url: 'page1.html',pageParam: {x: '1000',y: '2000 ...
- (在数据库中调用webservices。)SQL Server 阻止了对组件 'Ole Automation Procedures' 的 过程'sys.sp_OACreate' 的访问
--开启 Ole Automation Procedures sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_config ...
- MySql社区版和企业版的区别
1.社区版的免费,出问题MySql公司概不负责,是企业版的测试版,功能却没有企业版功能完善. 2.企业版的收费,并且价格不便宜,标准版2000美元,企业版5000美元,高级集群版10000美元(6万人 ...