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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值