可以触发点击事件并变色的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="",但是这样写有些场景的是实现不了的,最 ...
随机推荐
- MySQL中date类型的空值0000-00-00和00:00:00
1.如果mysql中使用了date类型,并且默认值为'0000-00-00', 那么数据库中的'0000-00-00 00:00:00', '0000-00-00', '00:00:00'这三个值是相 ...
- springMVC对于Controller返回值的可选类型
2018-01-11 对于springMVC处理方法支持支持一系列的返回方式: (1)ModelAndView (2)Model (3)ModelMap (4)Map (5)View (6)Stri ...
- json对象按时间排序
//正序var data = {"rows": [{"name": "张三","time": "2011/4/ ...
- ActiveMQ专题1: 入门实例
序 好久没有写博客了,最近真的是可以说是忙成狗了.项目的事和自己的终身大事忙得焦头烂额,好在是一切都是越来越好了...... 趁着项目今天唯一的一点喘息时间,加上项目开始接触到的mq,开始写一篇amq ...
- UnityShader之屏幕特效基础
1.什么是屏幕特效 我们这里讲的屏幕特效技术,指的是在渲染完整个场景后得到的屏幕图象的基础上,再对这个屏幕图像做一系列处理,实现出屏幕特效,使用这种技术可以为屏幕画面增添各种风格的艺术效果,比如泛光. ...
- npm run build之后生成的dist如何扔到服务器运行(npm run build之后如何本地运行)
运行npm run build之后,会生成一个dist文件夹,里面的目录结构大概是这样的: 生成完的文件我们怎么来运行呢?直接在本地打开inde.html是无法运行的,打包的时候有提示: 构建文件应该 ...
- Ajax 学习(一)
此篇为学习笔记 概述 Ajax(Asynchronous Javascrpt And Xml)是一种运用于浏览器的技术,它可以在浏览器与服务器之间使用异步通信机制进行数据通信,从而允许浏览器向服务器获 ...
- GitHub fork的使用
我的GitHub账号是lanshanxiao,fork的账号是king1ko1king,再此说明! fork的项目是:Class-for-Everyone-Java-Server- 作者源项目地址是: ...
- Var与Dynamic的区别
1.var与dynamic的区别 C#中的很多关键词用法比较容易混淆,var和dynamic就是其中一组,但其实它们是有本质的区别的.var 在编译阶段已经确定类型,在初始化时候,必须提供初始化的 ...
- 实习小结(四)--- MyBatis Generator使用
第一次听闻MyBatis Generator插件很是惊讶,已经有这么便捷方式的工具通过数据库表来自动生成实体类,映射文件,接口以及帮助类,而且可以通过自己写方法来增加中文注释,遂来学习一波.首先先建一 ...