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