不规则区域的点击
以一个正五角星为例,点击五角星内的区域,五角星会改变颜色。重写hittest方法实现改功能。五角星十个点的坐标如图:
1 // StarView.m 2 3 #import "StarView.h" 4 5 #define randomColor [UIColor colorWithRed:arc4random_uniform(255)/255.0 green:arc4random_uniform(255)/255.0 blue:arc4random_uniform(255)/255.0 alpha:1]; 6 7 @interface StarView() 8 @property (nonatomic, assign) CGPoint p1; 9 @property (nonatomic, assign) CGPoint p11; 10 @property (nonatomic, assign) CGPoint p2; 11 @property (nonatomic, assign) CGPoint p22; 12 @property (nonatomic, assign) CGPoint p3; 13 @property (nonatomic, assign) CGPoint p33; 14 @property (nonatomic, assign) CGPoint p4; 15 @property (nonatomic, assign) CGPoint p44; 16 @property (nonatomic, assign) CGPoint p5; 17 @property (nonatomic, assign) CGPoint p55; 18 @end 19 20 @implementation StarView 21 22 - (instancetype)initWithFrame:(CGRect)frame{ 23 self = [super initWithFrame:frame]; 24 if (self) { 25 self.backgroundColor = [UIColor clearColor]; 26 } 27 return self; 28 29 } 30 31 - (void)drawRect:(CGRect)rect { 32 33 CGFloat R = rect.size.width / 2; 34 CGFloat r = R*sin(M_PI/10.0)/sin(3*M_PI/10.0); 35 36 UIBezierPath *path = [UIBezierPath bezierPath]; 37 38 _p1 = CGPointMake(R*(1.0-cos(M_PI/10.0)), R*(1.0-sin(M_PI/10.0))); 39 _p11 = CGPointMake(R-r*cos(3*M_PI/10.0), R-r*sin(3*M_PI/10.0)); 40 41 _p2 = CGPointMake(R, 0); 42 _p22 = CGPointMake(R+r*cos(3*M_PI/10.0), R-r*sin(3*M_PI/10.0)); 43 44 _p3 = CGPointMake(R*(1.0+cos(M_PI/10.0)), R*(1.0-sin(M_PI/10.0))); 45 _p33 = CGPointMake(R+r*cos(M_PI/10.0), R+r*sin(M_PI/10.0)); 46 47 _p4 = CGPointMake(R*(1.0+sin(M_PI/5.0)), R*(1.0+cos(M_PI/5.0))); 48 _p44 = CGPointMake(R, R+r); 49 50 _p5 = CGPointMake(R*(1.0-sin(M_PI/5.0)), R*(1.0+cos(M_PI/5.0))); 51 _p55 = CGPointMake(R-r*cos(M_PI/10.0), R+r*sin(M_PI/10.0)); 52 53 [path moveToPoint:_p1]; 54 [path addLineToPoint:_p11]; 55 [path addLineToPoint:_p2]; 56 [path addLineToPoint:_p22]; 57 [path addLineToPoint:_p3]; 58 [path addLineToPoint:_p33]; 59 [path addLineToPoint:_p4]; 60 [path addLineToPoint:_p44]; 61 [path addLineToPoint:_p5]; 62 [path addLineToPoint:_p55]; 63 UIColor *color = randomColor; 64 [color setFill]; 65 [path fill]; 66 } 67 68 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{ 69 [super hitTest:point withEvent:event]; 70 if ((point.y>_p1.y && 71 (point.x-_p22.x)/(_p44.x-_p22.x)>(point.y-_p22.y)/(_p44.y-_p22.y) && 72 (point.x-_p1.x)/(_p44.x-_p1.x)>(point.y-_p1.y)/(_p44.y-_p1.y) 73 ) || 74 (point.y < _p11.y && 75 (point.x-_p11.x)/(_p2.x-_p11.x)>(point.y-_p11.y)/(_p2.y-_p11.y) && 76 (point.x-_p2.x)/(_p22.x-_p2.x)<(point.y-_p2.y)/(_p22.y-_p2.y) 77 ) || 78 (point.y > _p22.y && 79 (point.x-_p33.x)/(_p22.x-_p33.x)<(point.y-_p33.y)/(_p22.y-_p33.y) && 80 (point.x-_p3.x)/(_p33.x-_p3.x)>(point.y-_p3.y)/(_p33.y-_p3.y) 81 ) || 82 ((point.x-_p22.x)/(_p4.x-_p22.x)<(point.y-_p22.y)/(_p4.y-_p22.y) && 83 (point.x-_p4.x)/(_p44.x-_p4.x)<(point.y-_p4.y)/(_p44.y-_p4.y) && 84 (point.x-_p22.x)/(_p44.x-_p22.x)<(point.y-_p22.y)/(_p44.y-_p22.y) 85 ) || 86 ((point.x-_p44.x)/(_p5.x-_p44.x)>(point.y-_p44.y)/(_p5.y-_p44.y) && 87 (point.x-_p5.x)/(_p55.x-_p5.x)>(point.y-_p5.y)/(_p55.y-_p5.y) && 88 (point.x-_p55.x)/(_p44.x-_p55.x)<(point.y-_p55.y)/(_p44.y-_p55.y) 89 ) 90 ){ 91 return self; 92 }else{ 93 return nil; 94 } 95 } 96 97 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{ 98 return NO; 99 } 100 101 @end
1 // ViewController.m 2 3 #import "ViewController.h" 4 #import "StarView.h" 5 6 @interface ViewController () 7 @property (nonatomic, strong) StarView *startView; 8 @end 9 10 @implementation ViewController 11 12 - (void)viewDidLoad { 13 [super viewDidLoad]; 14 15 _startView = [[StarView alloc]initWithFrame:CGRectMake(20, 200, 180, 180)]; 16 [self.view addSubview:_startView]; 17 18 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(clickStar)]; 19 [_startView addGestureRecognizer:tap]; 20 } 21 22 - (void)clickStar{ 23 [_startView setNeedsDisplay]; 24 } 25 26 @end