可以触发点击事件并变色的UILabel
谁说UILabel不能够当做button处理点击事件呢?今天,笔者就像大家提供一个改造过的,能够触发点击事件并变色的UILabel:)
效果图:
还能当做计时器用囧:
源码如下:
TapLabel.h 与 TapLabel.m
//// TapLabel.h// TapLabel//// Copyright (c) 2014年 Y.X. All rights reserved.//#import@class TapLabel;@protocol TapLabelDelegate - (void)tapLabelEvent:(TapLabel *)label;@end@interface TapLabel : UILabel@property (nonatomic, assign) id 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 ()@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:)
原理就是这么简单呢:)