2024年2月20日发(作者:)
UISlider添加单击事件
原生UISlider用作进度条时没有提供单击事件的接口,通过继承在子类中实现单击事件又有杀鸡用牛刀的感觉,于是考虑在Category中实现。
创建UISlider+touch.h和UISlider+touch.m文件,添加单击事件方法:
@interface UISlider (touch)
// 单击手势
- (void)addTapGestureWithTarget: (id)target
action: (SEL)action;
@end复制代码
实现原理是为UISlider对象添加UITapGestureRecognizer,当触发tap事件时利用传入的target和action回调单击事件。-----------------------------------------------------------------------------
---在Category添加方法很简单,但是要扩展属性以保存传入的target和action两个参数就需要利用associative机制了(‘associative’机制参考文章)。使用它我们要在.m文件中引入#import <objc/runtime.h>这里我们主要用到以下两个方法:objc_setAssociatedObject:// 添加扩展属性
void objc_setAssociatedObject(id object, void *key, id
value, objc_AssociationPolicy policy)
objc_getAssociatedObject// 获取扩展属性
id objc_getAssociatedObject(id object, void *key)复制代码
通过objc_setAssociatedObject方法我们可以为UISlider扩展两个属性来接收传入的target和action。通过objc_getAssociatedObject方法就可以在接收到UITapGestureRecognizer单击手势时获取target和action,利用[target performSelector:action withObject:self]方法实现单击事件的回调。
--------------------------------------------------------------------------------下面看下.m中的具体实现:addTapGestureWithTarget
方法为UISlider对象添加UITapGestureRecognizer手势,并为它扩展了三个属性。
static char *gestureKey;
static char *targetKey;
static char *actionStringKey;
@implementation UISlider (touch)
- (void)addTapGestureWithTarget: (id)target action:
(SEL)action
{
id gesture = objc_getAssociatedObject(self,
&gestureKey);
if (!gesture) {
objc_setAssociatedObject(self, &targetKey,
target, OBJC_ASSOCIATION_ASSIGN);
objc_setAssociatedObject(self,
&actionStringKey, NSStringFromSelector(action),
OBJC_ASSOCIATION_RETAIN);
UITapGestureRecognizer *tap =
[[UITapGestureRecognizer alloc]initWithTarget:self action:
@selector(tap:)];
OfTapsRequired = 1;
OfTouchesRequired = 1;
[self addGestureRecognizer:tap];
objc_setAssociatedObject(self, &gestureKey,
tap, OBJC_ASSOCIATION_RETAIN);
}
} 复制代码
tap:方法中根据点击的位置更新UISlider对象的value,同时从扩展属性中获取target和action回调单击事件。
- (void)tap: (UITapGestureRecognizer *)sender
{
if ( == UIGestureRecognizerStateEnded)
{
CGPoint location = [sender locationInView:self];
float x = location.x;
float r = x/;
float value =
(mValue) * r;
[self setValue:value animated:YES];
id target = objc_getAssociatedObject(self,
&targetKey);
if (target) {
NSString *actionStr =
objc_getAssociatedObject(self, &actionStringKey);
SEL action =
NSSelectorFromString(actionStr);
[target performSelector:action
withObject:self];
}
}
}复制代码
dealloc方法中移除UITapGestureRecognizer-
(void)dealloc
{
UITapGestureRecognizer *tap;
id gesture = objc_getAssociatedObject(self,
&gestureKey);
if (gesture) {
tap = (UITapGestureRecognizer*)gesture;
[self removeGestureRecognizer:tap];
}
}
@end复制代码
--------------------------------------------------------------------------------这样我们为UISlider添加单击事件,只需要将Category
文件拷入项目import引入就OK了。原文链接:/bbs/?tid=145660&fpage=3


发布评论