可以触发点击事件并变色的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的更多相关文章

  1. view.performClick()触发点击事件

    1.主要作用 自动触发控件的点击事件 2.界面的布局文件  activity_main.xml <RelativeLayout xmlns:android="http://schema ...

  2. 解决jQuery ajax动态新增节点无法触发点击事件的问题

    在写ajax加载数据的时候发现,后面添加进来的demo节点元素,失去了之前的点击事件.为什么点击事件失效,我们该怎么去解决呢? 其实最简单的方法就是直接在标签中写onclick="" ...

  3. 解决JavaScript拖动时同时触发点击事件的BUG

    在做在线地图项目的时候,在给marker点绑定事件时,因为有点击事件click,同时又存在拖动dragEnd事件,首先没有重大缺陷,就是在用户在点击的时候,有时候本想是点击,但是他触发了drag的事件 ...

  4. 关于AJAX异步加载节点无法触发点击事件问题的解决方式

    做练习的过程中遇到一个问题,使用AJAX异步新增一个节点,无法触发点击事件,经过查阅之后知道一个方式,使用JS的委托事件,在此做一个记录. $(document).on('click', '.recr ...

  5. JS实现按下按键触发点击事件

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. vue中Enter触发登录事件和javascript中Enter触发点击事件

    created(){ window.addEventListener('keydown', this.handleKeyDown, true)//开启监听键盘按下事件 } 在methods中当keyC ...

  7. Echarts如何添加鼠标点击事件?防止重复触发点击事件

    Echarts如何添加鼠标点击事件? 1.通常我们只使用了以下代码,通过配置项和数据显示图表. var myChart = echarts.init(document.getElementById(' ...

  8. heightcharts点击曲线图获取返回值的问题(ios点击图表第一次无法触发点击事件解决方法)

    需求:用的heightcharts插件,点击曲线图想获得所点击点的返回值,如图 问题代码: (function chart_line(){ var data={"title":[& ...

  9. js中 ajax动态新增节点无法触发点击事件

    在写ajax加载数据的时候发现,后面添加进来的demo节点元素,失去了之前的点击事件. 其实最简单的方法就是直接在标签中写onclick="",但是这样写有些场景的是实现不了的,最 ...

随机推荐

  1. Ubuntu系统下OpenDaylight源码编译安装

    操作系统:Linux x64 / Ubuntu 14.04 研究领域:软件定义网络SDN (Software-defined Networking) 开发组件:OpenDaylight 声明:转载请注 ...

  2. 终于完成了-- github.com/salomon1184/METP

  3. Druid连接池(三)

    十二.Druid缓存 连接Oracle数据库,打开PSCache,在其他的数据库连接池都会存在内存占用过多的问题,Druid是唯一解决这个问题的连接池. Oracle数据库下PreparedState ...

  4. UUID生成随机数工具类

    package com.qiyuan.util; import java.util.UUID; public class RanNum { /** * 生成随机数<br> * GUID: ...

  5. ruby冒泡算法删除店铺下的重复评论

    Shop.each do |shop| if !shop.comments.blank? n = shop.comments.length for i in 0..n-1 for j in i+1.. ...

  6. 高云的jQuery源码分析笔记

    (function( window, undefined ) { // 构造jQuery对象 var jQuery = function( selector, context ) { return n ...

  7. [BZOJ 2655]calc

    Description 题库链接 给出 \(A,n,p\) ,让你在模 \(p\) 意义下求所有序列 \(a\) 满足"长度为 \(n\) 且 \(a_i\in[1,A]\) ,并且对于 \ ...

  8. 转载:SQL中的case when then else end用法

    SQL中的case when then else end用法 来源: http://www.cnblogs.com/prefect/p/5746624.html Case具有两种格式.简单Case函数 ...

  9. Differences between page and segment

    https://techdifferences.com/difference-between-paging-and-segmentation-in-os.html how does paging so ...

  10. 现代 C++ 编译时 结构体字段反射

    基于 C++ 14 原生语法,不到 100 行代码:让编译器帮你写 JSON 序列化/反序列化代码,告别体力劳动.