前几天去面试,面试官问到继承UIView实现和系统UIButton相似的监听方法,心里面知道这是难为人的问题,其实没啥用,但是还是打算写出来,分享给需要的小伙伴.
一.自定义Button首先了解一下UIView的触摸事件:
/** 1.当触摸开始时会调用下面的事件 */
-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event;
/** 2.当触摸移动时会调用下面的事件 */
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent*)event;
/** 3.当触摸结束时会调用下面的事件 */
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent*)event;
/** 4.当触摸取消时会调用下面的事件 */
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent*)event;
所以,在封装自己的button时,会用到上述的方法触发回调;
二.实现
首先新建一个TTButton类,继承于UIView, 在TTButton类中自定义button.下面要为自定义Button添加target和action接口,步骤如下:
1.在TTButton.h中声明方法:
//添加targetAction回调
-(void)addTarget:target action:(SEL)action;
2.在TTButton.m中进行实现:
(1),添加私有扩展属性:
@interface TTButton()
/** target */
@property(nonatomic, weak) id target;
/** action */
@property(nonatomic, assign) SEL action;
@end
(2),方法实现:
//回调
-(void)addTarget:(id)target action:(SEL)action
{
self.target= target;
self.action= action;
}
-(void)touchesEnded:(NSSet *) touches withEvent:(UIEvent*) event
{
//获取触摸对象
UITouch *touche = [touches anyObject];
//获取touche的位置
CGPoint point = [touche locationInView: self];
//判断点是否在button中
if(CGRectContainsPoint(self.bounds, point)) {
//执行action
[self.target performSelector: self.action withObject: self];
}
}
3.如何使用:
导入头文件使用一下:
TTButton *btn = [[TTButton alloc] initWithFrame:CGRectMake(100,100,100,30)];
btn.backgroundColor = [UIColor redColor];
[btn addTarget: self action:@selector(btnClick)];
[self.view addSubview: btn];
-(void)btnClick
{
TTLog(@"黄文涛");
}
到此就结束了,欢迎交流指正, 本人QQ:1334627194