可以触发点击事件并变色的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