不规则区域的点击

以一个正五角星为例,点击五角星内的区域,五角星会改变颜色。重写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

 

posted @ 2016-08-07 11:17  wwh99  阅读(350)  评论(0编辑  收藏  举报