通过path绘制点击区域

效果

源码

https://github.com/YouXianMing/Animations

//
//  TapDrawImageView.h
//  TapDrawImageView
//
//  Created by YouXianMing on 16/5/9.
//  Copyright © 2016年 YouXianMing. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "TapDrawPathManager.h"
@class TapDrawImageView;

static NSString *tapDrawImageViewNormalState    = @"normalState";
static NSString *tapDrawImageViewHighlightState = @"highlightState";
static NSString *tapDrawImageDisableState       = @"disableState";

@protocol TapDrawImageViewDelegate <NSObject>

- (void)tapDrawImageView:(TapDrawImageView *)tapImageView selectedPathManager:(TapDrawPathManager *)pathManager;

@end

@interface TapDrawImageView : UIView

@property (nonatomic, weak)   id <TapDrawImageViewDelegate>  delegate;

@property (nonatomic, strong) NSMutableArray  <TapDrawPathManager *>  *pathManagers;

@end
//
//  TapDrawImageView.m
//  TapDrawImageView
//
//  Created by YouXianMing on 16/5/9.
//  Copyright © 2016年 YouXianMing. All rights reserved.
//

#import "TapDrawImageView.h"

@interface TapDrawImageView ()

@property (nonatomic, strong) TapDrawPathManager  *currentSelectedManager;
@property (nonatomic, strong) UIImageView         *imageView;

@end

@implementation TapDrawImageView

- (instancetype)initWithFrame:(CGRect)frame {

    if (self = [super initWithFrame:frame]) {

        self.pathManagers    = [NSMutableArray array];
        self.backgroundColor = [UIColor clearColor];
    }

    return self;
}

- (void)drawRect:(CGRect)rect {

    CGContextRef context = UIGraphicsGetCurrentContext();

    [self.pathManagers enumerateObjectsUsingBlock:^(TapDrawPathManager *pathManager, NSUInteger idx, BOOL *stop) {

        TapDrawObject *drawObject = [pathManager.colorsType objectForKey:pathManager.currentDrawType];

        // Set Fill Color.
        {
            CGFloat red   = 0;
            CGFloat green = 0;
            CGFloat blue  = 0;
            CGFloat alpha = 0;
            [drawObject.fillColor getRed:&red green:&green blue:&blue alpha:&alpha];
            CGContextSetRGBFillColor(context, red, green, blue, alpha);
        }

        // Set Stroke Color.
        {
            CGFloat red   = 0;
            CGFloat green = 0;
            CGFloat blue  = 0;
            CGFloat alpha = 0;
            [drawObject.strokeColor getRed:&red green:&green blue:&blue alpha:&alpha];
            CGContextSetRGBStrokeColor(context, red, green, blue, alpha);
        }

        pathManager.path.lineWidth = drawObject.lineWidth;
        [pathManager.path fill];
        [pathManager.path stroke];
    }];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch     = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self];

    [self.pathManagers enumerateObjectsUsingBlock:^(TapDrawPathManager *pathManager, NSUInteger idx, BOOL *stop) {

        if ([pathManager.path containsPoint:touchPoint]) {

            if (self.delegate && [self.delegate respondsToSelector:@selector(tapDrawImageView:selectedPathManager:)]) {

                [self.delegate tapDrawImageView:self selectedPathManager:pathManager];
            }

            if ([pathManager.currentDrawType isEqualToString:tapDrawImageDisableState] == NO) {

                pathManager.currentDrawType = tapDrawImageViewHighlightState;
                _currentSelectedManager     = pathManager;
                [self setNeedsDisplay];
            }

            *stop = YES;
        }
    }];
}

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event {

    if (_currentSelectedManager) {

        _currentSelectedManager.currentDrawType = tapDrawImageViewNormalState;
        [self setNeedsDisplay];
    }
    _currentSelectedManager = nil;
}

- (void)touchesCancelled:(nullable NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event {

    if (_currentSelectedManager) {

        _currentSelectedManager.currentDrawType = tapDrawImageViewNormalState;
        [self setNeedsDisplay];
    }
    _currentSelectedManager = nil;
}

@end
时间: 2024-10-13 16:18:10

通过path绘制点击区域的相关文章

自定义button的点击区域

某些情况下我们需要按钮有不规则的形状,在这些形状内点击才有响应,例如下面的图片中: 图片中红线圈出的两处都是用按钮做的,按钮的实际布置是上面第二张图所画的那样,所有按钮都是矩形的,但是中间的按钮和一圈的转盘形状都不可能用矩形,否则点击的时候难免相互影响. 那么如何自定义按钮点击的有效区域呢,其实很简单,只要重写一个函数即可: - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 系统发生触摸事件的时候会从window到父控件到

点击区域外隐藏该区域,event.stopPropagation()

event.stopPropagation() Description: Prevents the event from bubbling up the DOM tree, preventing any parent handlers from being notified of the event. 点击区域外隐藏该区域Example: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta content="chars

在UITableView的 didSelectRowAtIndexPath中获取点击区域

项目中,要在UITableViewCell区分不同的点击区域,比如左边点击执行某个操作,右边点击执行另一个操作.原本我的方案是在cell的左边和右边各放一个透明的UIButton,点击两个button执行不同的操作,而controller中的didSelectRowAtIndexPath函数就设为空了.但是后来有个问题,就是可以同时用多个手指长按在不同的cell上,导致触发过个操作,而且cell的选中态也不好控制. 后来想到,UIview的触摸事件可以得到触摸的位置,那可不可以在cell的tou

如何扩大ImageView的点击区域

我们在开发中会遇到,给imageview设置点击事件,但是美工切的原始图片一般在24dp左右,这个尺寸点击时会出现不灵敏的情况(点击区域太小). 解决方案: 给imageView设置  scaleType=”centerInside“   然后加大imageview的尺寸即可.  设置这个属性后,imageview不管多大,图片总是以本身的大小剧中显示. 注意事项:如果直接使用padding值来设置,图片的大小调整不好的话会出现图片被拉伸或压缩的情况.所以最简便的方法是使用scaleType属性

ios 添加到cell 上的button点击无效!扩大button的点击区域(黑魔法)

一般情况下点击效果都是正常的!要不然你对它做了什么?一般细心的小伙伴都没有遇到这种情况,但是呢! 当然我是二班的!在这里我主要讲两个问题,解决问题和普及魔法. 一.普及问题(button在cell上点击无效) 自定义一个cell,cell里边creat了一个button!然后调试了半天,什么反应都没有! 1.button的enable 设置为yes可点击的. 1.我以为我设置了交互禁用! self.userInteractionEnabled = YES; 2.button的frame越界了!

HTML &lt;area&gt; 标签 带有可点击区域的图像映射(图像映射指的是带有可点击区域的图像)

例子: <img src="planets.gif" width="145" height="126" alt="Planets" usemap="#planetmap"> <map name="planetmap"> <area shape="rect" coords="0,0,82,126" href="

Android上滑手势触发和不增加布局层级扩大点击区域

最近项目中需要实现手势上滑或者点击滑出界面的效果,实现上是利用GestureDetector,然后在onFling中判断,但遇到一个问题:手势上滑是针对整个布局的,但如果有对单独的View设置点击监听,在该View上的手势上滑会失效. 如果这个View本身就是专门用于点击的,那并没有什么问题,可惜的是,这个View的尺寸不大,所以要求扩大点击区域. 我们首先能想到的方法就是用一个容器将该View包起来,类似RelativeLayout,LinearLayout等,但这样布局的层级就会再加多一层.

CocoStudio textfiled 文本点击区域按背景拉伸

我用的是cocos2dx2.2版本,textfield的settouchsize 只是一个样式,点击输入框的时候只有点击到文字才能进行输入,当文本长度很短视,体验感差的不行 直接说方法吧,废话也没人看.. 为要点击的区域增加 imageview exchangeTextBg = dynamic_cast<ImageView *>(ui->getWidgetByName("reward_exchange_bg_0")); exchangeTextBg->setTo

MFC 用gdi绘制填充多边形区域

MFC 用gdi绘制填充多边形区域 这里的代码是实现一个三角形的绘制,并用刷子填充颜色 在OnPaint()函数里面 运用的是给定的三角形的三个点,很多个点可以绘制多边形 [cpp] view plaincopy CBrush br(RGB(40,130,170)); CRgn rgn; CPoint arrpt[3]; arrpt[0].x = m_rcAT.right-8; arrpt[0].y = m_rcAT.top+m_rcAT.Height()*2/5; arrpt[1].x = a