可以触发点击事件并变色的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 >= 0 &&
            locationPoint.y <= self.bounds.size.height && locationPoint.y >= 0)
        {
            self.highlighted = YES;
        }
        else
        {
            self.highlighted = NO;
        }
    }

    // 状态3
    if (gesture.state == UIGestureRecognizerStateEnded)
    {
        if (locationPoint.x <= self.bounds.size.width && locationPoint.x >= 0 &&
            locationPoint.y <= self.bounds.size.height && locationPoint.y >= 0)
        {

            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(0, 0, 320, 20)];
    tap.textAlignment        = NSTextAlignmentCenter;
    tap.center               = self.view.center;
    tap.text                 = @"YouXianMing";
    tap.font                 = [UIFont fontWithName:@"HelveticaNeue-Thin" size:18];
    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:)

原理就是这么简单呢:)

时间: 2024-12-23 02:38:22

可以触发点击事件并变色的UILabel的相关文章

servlet-jqgrid点击查询按钮,怎么触发点击事件,怎么把查询条件带进去

问题描述 jqgrid点击查询按钮,怎么触发点击事件,怎么把查询条件带进去 页面 function selectJobLog(){ var txDate=$("#txDate").val(); var jobName=$("#jobName").val(); $("#tableList").jqGrid({ url:"${pageContext.request.contextPath}/listLogDb", postData

android-listView下拉刷新时,为什么同时触发点击事件,如何让下拉时不触发点击事件

问题描述 listView下拉刷新时,为什么同时触发点击事件,如何让下拉时不触发点击事件 /** * Touch事件 */ @Override public boolean onTouchEvent(MotionEvent ev) { Log.e("666","555"); switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: //按下时Y坐标 // 正在刷新不能移动 if (currentState ==

imageview-Android关于改变ListView里面的ImageView控件的背景图出现无法触发点击事件的问题

问题描述 Android关于改变ListView里面的ImageView控件的背景图出现无法触发点击事件的问题 问题说明:我使用AudioRecord进行录音,想要点击ImageView开始录音,然后根据音量大小设置ImageView背景图 ,由于ImageView是ListView的Item里面的一个子控件,于是我开启一个线程,使Thread.sleep(100);后 notifyDataSetChanged(),这时问题就出现了,当我再次点击ImageView想要录音暂停时,发现有时候点击事

jquery-JQuery 动态添加ID后,无法触发点击事件

问题描述 JQuery 动态添加ID后,无法触发点击事件 html代码 学校 姓名 js代码 function abc($ww) { $("#wo").append(" 专业 "); } function a($dd) { $("#h1").html('小明'); } 点击后,为什么无法改变? 解决方案 你的代码没贴全吧,还是没有使用代码片html被过虑了? 首先function a($dd),括号中的参数是不需要加$符号的,其次就是没有绑定点击

ASP.NET中RadioButtonList绑定后台数据后触发点击事件_实用技巧

本文实例为大家分享了RadioButtonList绑定后台数据,触发点击事件的方法 首先前台页面放置一个RadioButtonList 控件 <asp:RadioButtonList runat="server" ID="RadioButtonList1" BorderStyle="None" RepeatColumns="3" CssClass="" RepeatLayout="Flow&

view.performClick()触发点击事件

1.主要作用      自动触发控件的点击事件 2.界面的布局文件  activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:lay

Android Listview中Button按钮点击事件冲突解决办法

  今天做项目时,ListView中含有了Button组件,心里一早就知道肯定会有冲突,因为以前就遇到过,并解决过,可惜当时没有记录下来. 今天在做的时候,继续被这个问题郁闷了一把,后来解决后,赶紧来记录下,以便日后参考.      首先,其实Listview中Button按钮点击事件冲突这种问题压根就不是太大的问题,因为我们完全可以将一个TextView的Backgroud设置成一个selector,也可以将一个TextView设计成一个按钮的样子,这样就可以绕过ListView和Button

控件-求助:button点击事件无法触发

问题描述 求助:button点击事件无法触发 前台是这样的 已选择: </ul> <asp:Button ID="btn_update_app" runat="server" Text="确定" onclick="btn_confirm_Click" /> <input id="Button3" type="button" value="取消&qu

jquery-ui-draggable-事件捕获对一个元素监听拖动事件并对这个元素的子元素监听点击事件

问题描述 事件捕获对一个元素监听拖动事件并对这个元素的子元素监听点击事件 在不支持事件冒泡的浏览器中.对一个元素监听拖动事件并对这个元素的子元素监听点击事件.这两个事件会冲突.只能执行拖动事件.这种问题怎么解决? 解决方案 Preference元素和监听事件 解决方案二: 说明你没点击到子元素,一般是从子元素冒泡,不支持冒泡不会触发父元素的拖动事件 不过有哪种浏览器不支持冒泡?还没碰到过.. 解决方案三: 浏览器都支持冒泡啊,如果你只用捕获,那么肯定是先监听到父元素的事件,再是子元素,但问题是你