UIView局部点击(转)

今天上班遇到一种情况,需要局部响应点击事件,比如在一个UIImageView中设置一个小圆圈图片,要求点击圆圈里面不响应点击,点击小圆圈外面的部分响应点击。
可以通过重写hitTest:withEvent: 和 pointInside: withEvent:方法来做到。

看一下hitTest:withEvent
*touch事件发生,创建UIEvent对象

*按照Application的view层次结构,逐层调用每个view的hitTest:withEvent:方法,并传入该event对象,view根据hitTest:withEvent:方法和来决定touch点是否包含在自己的bounds中;

*如果view的bounds包含了touch点,该view会遍历自己的subview,并调用每个subview的pointInside:withEvent:方法来进一步决定touch事件是发生在自己本身,还是自己的subview上。

*重复第二,三步,并筛选出最终接受touch事件的view对象

//继承  建子类  重写上述方法

@interface CustomImageView : UIImageView

@property (strong, nonatomic) UIBezierPath *bezierPath;

@end

@implementation CustomImageView

- (id)init

{

    self = [super init];

    if (self) {

    }

    return self;

}

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

    UIView *result = [super hitTest:point withEvent:event];

    return [self pointInside:point withEvent:event] ? self : result;

}

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event

{

    return CGPathContainsPoint(self.bezierPath.CGPath, NULL, point, YES) ? YES : NO;

}

@end

//使用部分的代码
  //中间的图片

    CustomImageView *imageView = [[CustomImageView alloc] initWithFrame:CGRectMake(0,0, imageWidth02, imageHeight02)];

    imageView.backgroundColor = [UIColor clearColor];
    imageView.userInteractionEnabled = YES;

    imageView.bezierPath = [UIBezierPath bezierPathWithOvalInRect:imageView.bounds];

    imageView.image = [UIImage imageNamed:kCenterImg];

    [self.view addSubview:imageView];

//这样就达到了点击局部响应事件的效果。关于userInteractionEnabled这个属性设置为NO的时候,表示这个view从事件队列移除出去。

时间: 2024-10-08 09:14:59

UIView局部点击(转)的相关文章

【Swift 2.1】为 UIView 添加点击事件和点击效果

前言 UIView 不像 UIButton 加了点击事件就会有点击效果,体验要差不少,这里分别通过自定义和扩展来实现类似 UIButton 的效果. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com 正文 一.为 UIView 添加点击事件 extension UIView { func addOnClickListener(target: AnyObject, action: Sel

IOS - UIView添加点击事件

UIView通过手势(Gesture-UITapGestureRecognizer)添加点击事件, 类似于UIButton的效果. 示例: UIImageView *iKnowIcon = [CYResource loadImageView:@"free-question-once-more-i-know.png"]; iKnowIcon.top = questionIcon.top + scaleWidthWith320(200); iKnowIcon.centerX = self.

IOS开发之功能模块--给任意的UIView添加点击事件

前言:好久没写博客,今天来一波.我在实际项目开发中,会遇到这样功能需求:我已经搭好了iOS的UI界面,但是很多界面的子View用了UIView,然后这些UIView中用了UILabel和UIImageView,然后接着需求要这些View能够有点击事件,比如一点击就跳转到某个控制器.一开始懵逼了,难道我还要把他们全部改成UIButton,但是UIButton不好添加子View,难道我还要全部自定义一下UIButton,就算自定义好了,在项目已经打好的界面还是要一个个替换,多麻烦.所以就想到通过UI

Swift 自定义UIView的点击穿透

早上写自定义View的时候,发现一个神奇的问题,因为真的比较神奇,所以就记录下 一般我们自定义View的时候喜欢这样写: override init(frame: CGRect) { super.init(frame:frame) //添加其他views self.addSubview(view1) } 这样的方式,创建出的View是不会有穿透点击效果的 然而,有一个绘制图形的接口是: override func drawRect(rect: CGRect) { //添加其他Views self

给uiview添加点击事件

前段时间遇到一个问题,navigation上的左侧返回按钮需要自定义,于是就给了一个view上去 代码如下 UIView *leftitleView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 54)]; [leftitleView addSubview:lab]; UITapGestureRecognizer *singleTap=[[UITapGestureRecognizer alloc]initWithTarget:self

【IOS】自定义可点击的多文本跑马灯YFRollingLabel

需求 项目中需要用到跑马灯来仅展示一条消息,长度合适则不滚动,过长则循环滚动. 虽然不是我写的,但看了看代码,是在一个UIView里面放入两个UILabel, 在前一个快结束的时候,另一个显示.然而点击处理的 确是UIView的点击事件. 然而看到比如地铁.公交里面的跑马灯是分了很多段显示的.虽然说可以将多段合并为一段来显示, 但是如果各个需要点击事件又该如何处理呢?于是我来自己实现可点击的多段跑马灯. 所以这篇随笔我要实现的跑马灯包含下面这种效果:(图中有5段   点击不同文本可触发相应的事件

【iOS】使用UIView绘制本地验证码

记录一笔: 绘制本地验证码View的一个Demo源码:(出处:http://www.cnblogs.com/jerehedu/p/4527707.html) .h文件的代码: 1 #import <UIKit/UIKit.h> 2 3 @interface AuthCodeView : UIView 4 5 @property (nonatomic, retain) NSMutableString *changeString; //验证码的字符串 6 @end .m文件的代码: 1 #impo

ios开发事件处理之:一:UIView的拖拽

1.ios当中常?的事件?  触摸事件 ,加速计事件 ,远程控制事件 2.什么是响应者对象? 继承了UIResponds的对象我们称它为响应者对象 UIApplication.UIViewController.UIView都继承?自UIResponder 因此它们都是响应者对象,都能够接收并处理事件 3.为什么说继承了UIResponder就能够处理事件? 因为UIResponder内部提供了以下?方法来处理事件 ?比如 触摸事件会调?用以下?方法: - (void)touchesBegan:(

iOS开发系列--让你的应用“动”起来

--iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画.动画组.转场动画,如何通过UIView的装饰方法对这些动画操作进行简化等.在今天的文章里您可以看到动画操作在iOS中是如何简单和高效,很多原来想做但是苦于没有思路的动画在iOS中将变得越发简单: CALayer CALayer简介 CALayer常用属性 CALayer绘图 C