iOS开发-17.触摸事件示例

来源:互联网 发布:安卓编程用什么语言 编辑:程序博客网 时间:2024/05/21 19:20

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];    }}
0 0