2011-12-28 15 views
8

enter image description herecome riempire il colore negli spazi bianchi usando l'evento tattile?

desidera riempire tutti gli spazi bianchi con colore differente che utilizzano eventi touch

In questo momento ho in grado di riempire i cerchi scegliere i colori da picker, ma come per riempire la parte intigrated con colore differente ......

-(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]; 
    } 
} 
+0

Non è chiaro cosa vuoi. Puoi dare una spiegazione dettagliata di dove l'utente dovrebbe toccare e un'immagine che mostra quali parti devono essere colorate? –

+0

nell'immagine sopra se clicco su qualsiasi spazio bianco dovrebbe essere colorato con un po 'di colore –

+0

Conto 8 spazi separati in quella foto, inclusa la parte esterna a tutti i cerchi. Quanti ne contate? –

risposta

1

Ci sono due compiti qui, il primo è rilevare quale regione è stata toccata, il secondo è riempire quella regione. Entrambi richiedono di calcolare i punti di intersezione del cerchio dell'immagine precedente utilizzando la trigonometria e di conoscerne le posizioni.

Una soluzione semplice per il rilevamento dell'area tattile sarebbe quella di verificare se il tocco è contenuto in uno qualsiasi dei cerchi, questo è facilmente calcolato calcolando la distanza dal punto di contatto dal centro del cerchio, se è inferiore al raggio è all'interno del cerchio. Se è all'interno di più di un cerchio, sai che appartiene a quella regione di intersezione. Se è all'interno di nessun cerchio, ma il componente x si trova tra il centro di un cerchio di sinistra e un cerchio di destra deve trovarsi nella regione tra tutti i cerchi. Altrimenti il ​​punto di contatto deve essere al di fuori di tutti i cerchi.

Per riempire le varie sezioni dell'immagine sopra, è possibile creare percorsi contenenti le regioni da riempire e riempirle con CGContextFillPath. Qualcosa del genere:

// 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); 

È possibile ripetere questo per tutti i percorsi che vuoi. È possibile calcolare gli archi di percorso da utilizzare dai punti di intersezione e dai raggi del cerchio.