1.示例1(视图穿透效果)
#import "RedView.h"
@interface RedView ()
// 先写以下属性,从代码往storyboard中拖线,不然无法拿到btn属性
@property (nonatomic, weak) IBOutlet UIButton *btn;
@end
@implementation RedView
// 重写hitTest方法
// 事件传递过程:事件->UIApplication->UIWindow->控制器的View->redView
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
// 将红色视图上的触摸点的位置转换为按钮上的位置
CGPoint btnP = [self convertPoint:point toView:self.btn];
// 判断转换后的点是否在按钮上
if([self.btn pointInside:btnP withEvent:event]){// 在的话,返回按钮为最合适的视图
return self.btn;
}else{ //若是不在,就返回系统默认的方式
return [super hitTest:point withEvent:event];
}
}
// 重写touches方法,验证是否点击了按钮外的红色视图位置,红色视图响应点击事件
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"返回红色视图");
}
@end
// 结果,点击按钮处,按钮能够响应(高亮)
// 点击红色视图除按钮外的其他地方,打印返回红色视图
// 点击白色视图处,控制器的View响应
2.示例2(按钮弹框的响应)
- 在控制器中实现按钮点击事件,创建子控件,并保存为按钮的属性
// 点击按钮弹出对话框
- (IBAction)btnClick:(ZJButton *)sender {
UIButton *chatBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[chatBtn setImage:[UIImage imageNamed:@"对话框"] forState:UIControlStateNormal];
[chatBtn setImage:[UIImage imageNamed:@"小孩"] forState:UIControlStateHighlighted];
// 根据图片自动计算尺寸
[chatBtn sizeToFit];
// 计算chatBtn的中心点
chatBtn.center = CGPointMake(chatBtn.bounds.size.width * 0.5, -chatBtn.bounds.size.height * 0.5);
// 添加到按钮上
sender.chatBtn = chatBtn;
[sender addSubview:chatBtn];
}
- 自定义ZJButton控件继承UIButton
// 重写touches:move:方法,让按钮可以拖拽
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
// 获取触摸对象
UITouch *touch = [touches anyObject];
// 获取上一个触摸点
CGPoint preP = [touch previousLocationInView:self];
// 获取当前触摸点
CGPoint curP = [touch locationInView:self];
// 计算偏移位置
CGFloat offsetX = curP.x - preP.x;
CGFloat offsetY = curP.y - preP.y;
// 让按钮随触摸位置偏移
self.transform = CGAffineTransformTranslate(self.transform, offsetX, offsetY);
}
// 重写hitTest方法,让点击对话框视图时,返回弹框对象
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
// 转换当前触摸位置到对话框的位置
CGPoint curP = [self convertPoint:point toView:self.chatBtn];
// 判断是否在对话框上
if ([self.chatBtn pointInside:curP withEvent:event]) {// 在弹框视图上
return self.chatBtn;
}else{// 不在弹框视图
return [super hitTest:point withEvent:event];
}
}