通过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

转载于:https://www.cnblogs.com/YouXianMing/p/5618626.html

通过path绘制点击区域相关推荐

  1. 【WPF】右键菜单ContextMenu可点击区域太小的问题

    [WPF]右键菜单ContextMenu可点击区域太小的问题 原文:[WPF]右键菜单ContextMenu可点击区域太小的问题 问题描述 正常使用右键菜单ContextMenu时,如果菜单项是不变的 ...

  2. QML实现异形按钮(不规则点击区域)

    前言 在一个带圆角的 Rectangle 上放置一个 MouseArea,当点击圆角外区域时,依旧能触发点击事件.用 OpacityMask 遮罩裁出来的图形也一样. Rectangle {width ...

  3. GoogleEarth二次开发平台指南(3) ---如何获取点坐标、绘制线路和区域、沿指定线路三维漫游

    上一文讲解了谷歌地球二次开发中遇到如何把图片.模型导入到谷歌地球的指定位置的问题.除了用户将自己的图片.模型导入到谷歌地球中来构建自己的三维场景外,获取点坐标.标注点位置.绘制线条和区域界线.沿指定线 ...

  4. Android扩大控件的点击区域

    在做Android应用开发时,会碰到imageView尺寸小,用户难点击的情况,所以在不改变imageView大小情况,对其点击区域进行扩大.这里有两种方法可实现. 方法一:在imageView的xm ...

  5. 【自己给自己题目做】之一:椭圆可点击区域

    [题一] 请实现以下需求,要做一个活动页面,页面上有一张图片(假设是800x600),图片正中心有一个椭圆形的可点击区域,假设椭圆长轴为200px(横向),短轴160px(纵向),请实现点击这个椭圆区 ...

  6. [html] 如何扩大CheckBox点击区域

    [html] 如何扩大CheckBox点击区域 用 label 包裹,扩大 label 尺寸 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主目录 ...

  7. [html] 怎样在页面上实现一个圆形的可点击区域?

    [html] 怎样在页面上实现一个圆形的可点击区域? 1.用canvas画布,弧线画圆,在canvas上监听点击事件 2.用一个div,给div添加圆角属性50,在div上添加点击事件 3.butto ...

  8. Sliverlight中使用Path绘制复杂几何图形

    Sliverlight中使用Path绘制复杂几何图形 转自http://www.riafan.com/article/silverlight/draw-with-path.html 在Sliverli ...

  9. SwiftUI学习笔记[path绘制]

    前言 绘制的底层是强大的,我们所用的各端语言只是在现代UI追求的步伐中和用户喜好的交互中求同存异,抽取封装出自成个性风格的UI控件,当然面对万亿级别的客户各个平台的UI库出也不可能满足所有的客户需求, ...

最新文章

  1. Intellij Idea创建一个简单的java项目
  2. linux下安装svn
  3. vue render函数_Vue原理解析(一):Vue到底是什么?
  4. GCC 常见参数配置
  5. SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除(drop table #tableName)吗?...
  6. 第 16 章 垃圾回收相关概念
  7. C语言打印九九乘法表
  8. VC2005运行库文件
  9. Numpy 用 npy/npz 文件保存与载入数据
  10. ArcGis——raster calculator
  11. 计算机未来的发展英语作文,关于科技发展英语作文(通用10篇)
  12. linux 下的字体引擎(xtt freetype xfs xft)
  13. oracle如何修改redo,修改oracle redo
  14. Word里面的大括号怎么打出来?
  15. Pycharm远程调试服务器代码出错:[Errno 2] No such file or directory
  16. 剪绳子(python)
  17. Gateway网关的使用
  18. 计算机基础练习题(包含答案)
  19. 利用canvas画布和rotate()方法让画的图形旋转起来
  20. win平板计算机,十大平板电脑排行,告诉你平板电脑哪个好

热门文章

  1. java代码实现解压文件_Java压缩/解压文件的实现代码
  2. php string slice,substring()与str.slice()区别
  3. mysql启动时执行sql server_常见 mysql 启动、运行.sql 文件错误处理
  4. NewCode----给定两个数R和n,输出R的n次方
  5. 《MySQL——恢复数据-误删行、表、库》
  6. c打印行号和函数_使用C中的函数名称,行号从任何函数打印错误消息
  7. 信息安全主动攻击和被动攻击_信息安全中的主动和被动攻击 网络安全
  8. 达尔豪斯大学计算机科学世界排名,达尔豪斯大学成了全加最好,这又是个什么排名?...
  9. 端口复用和重映射--STM32F103
  10. uva 1025——A Spy in the Metro