如何使用触摸事件填充白色空间中的颜色?

时间:2011-12-28 09:23:29

标签: iphone ios4

enter image description here

希望使用触摸事件填充所有不同颜色的空白

现在我可以填充从拾取器中拾取颜色的圆圈,但是如何用不同颜色填充镶边部分......

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UIColor *cl=[UIColor clearColor];
    UITouch *tuch=[touches anyObject];
    if ([clr isEqualToString:@"Red"]) {
        cl=[UIColor redColor];
    }
    else if ([clr isEqualToString:@"Blue"]) {
        cl=[UIColor blueColor] ;
    }
    else if ([clr isEqualToString:@"Green"]) {
        cl=[UIColor greenColor];
    }


    CGPoint p = [tuch locationInView:self];
    float xsq1=p.x -50;
    xsq1=xsq1*xsq1;
    float ysq1=p.y-110;
    ysq1=ysq1*ysq1;
    float h1 = ABS(sqrt(xsq1 + ysq1));

    float xsq2=p.x -100;
    xsq2=xsq2*xsq2;
    float ysq2=p.y-110;
    ysq2=ysq2*ysq2;
    float h2 = ABS(sqrt(xsq2 + ysq2));

    float xsq3=p.x -50;
    xsq3=xsq3*xsq3;
    float ysq3=p.y-190;
    ysq3=ysq3*ysq3;
    float h3 = ABS(sqrt(xsq3 + ysq3));

    if (h1<=40) {
        NSLog(@"touches inside of first circle");
        CGContextSetFillColorWithColor(context, cl.CGColor);
        CGRect cir1 = CGRectMake(10,266,80,80);
        CGContextFillEllipseInRect(context, cir1);
        [self setNeedsDisplayInRect:cir1];
    }
    else if (h2<=40) {
        NSLog(@"touches inside of second circle");
        CGContextSetFillColorWithColor(context, cl.CGColor);
        CGRect cir2 = CGRectMake(60,266,80,80);
        CGContextFillEllipseInRect(context, cir2);
        [self setNeedsDisplayInRect:cir2];
    }
}

1 个答案:

答案 0 :(得分:1)

这里有两个任务,第一个是检测哪个区域被触摸,第二个是填充该区域。两者都要求您使用三角函数计算上面图像的圆交点,并知道它们的位置。

触摸区域检测的一个简单解决方案是检查触摸是否包含在任何圆圈中,如果小于半径,则可以通过计算从圆心到触摸点的距离来轻松计算它在圈内。如果它在多个圆圈内,您知道它属于该交叉区域。如果它不在圆圈内,但是x组件位于左圆圈和右圆圈之间,它必须位于所有圆圈之间的区域中。否则,触摸点必须在所有圆圈之外。

为了填充上图中的各个部分,您可以创建包含需要填充的区域的路径,并使用CGContextFillPath填充它们。像这样:

// draw a path to contain the fill region
CGContextBeginPath(ctx);
CGContextMoveToPoint(ctx, startx, starty);
CGContextAddArcToPoint(ctx, ...);

// lots of other CGContextAddArcToPoint or AddLineToPoint method calls here to define the clip region

// close the clip path
CGContextClosePath(ctx);

// now you can fill the region
CGContextFillPath(ctx);

您可以根据需要为多个路径重复此操作。您可以从圆交点和半径计算要使用的路径弧。