2013-04-13 5 views
5

Voglio disegnare l'area trasparente con il pennello, ma il mio codice non funziona molto bene. Penso che qualcuno possa aiutarmi qui. Il mio codice:come posso riempire l'area trasparente dell'immagine quando il mio dito si sposta su

// Handles the start of a touch 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CGRect bounds = [self bounds]; 
    UITouch *touch = [[event touchesForView:self] anyObject]; 

    if (![image isPointTransparent:[touch locationInView:self]] 
     || ![image isPointTransparent:[touch previousLocationInView:self]]) 
    { 
     return; 
    } 

firstTouch = YES; 

    // Convert touch point from UIView referential to OpenGL one (upside-down flip) 

location = [touch locationInView:self]; 
location.y = bounds.size.height - location.y; 
} 

// Handles the continuation of a touch. 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CGRect bounds = [self bounds]; 
    UITouch *touch = [[event touchesForView:self] anyObject]; 

    if (![image isPointTransparent:[touch locationInView:self]] 
     || ![image isPointTransparent:[touch previousLocationInView:self]]) 
    { 
     return; 
    } 

// Convert touch point from UIView referential to OpenGL one (upside-down flip) 
if (firstTouch) 
    { 
    firstTouch = NO; 
     previousLocation = [touch previousLocationInView:self]; 
    previousLocation.y = bounds.size.height - previousLocation.y; 
} 
    else 
    { 
    location = [touch locationInView:self]; 
    location.y = bounds.size.height - location.y; 
    previousLocation = [touch previousLocationInView:self]; 
    previousLocation.y = bounds.size.height - previousLocation.y; 
} 

// Render the stroke 
[self renderLineFromPoint:previousLocation toPoint:location]; 
} 

// Handles the end of a touch event when the touch is a tap. 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CGRect bounds = [self bounds]; 
    UITouch *touch = [[event touchesForView:self] anyObject]; 

    if (![image isPointTransparent:[touch locationInView:self]] || ![image isPointTransparent:[touch previousLocationInView:self]]) 
    { 
     return; 
    } 

    if (firstTouch) 
    { 
     firstTouch = NO; 
     previousLocation = [touch previousLocationInView:self]; 
     previousLocation.y = bounds.size.height - previousLocation.y; 
     [self renderLineFromPoint:previousLocation toPoint:location]; 
} 
} 
+1

Qual è esattamente il tuo problema? Ti preghiamo di specificare quali sono i problemi che stai riscontrando, in quanto non possiamo solo indovinare guardando il tuo codice. Dicci cosa non va quando esegui la tua applicazione. – klcjr89

+1

C'è un ottimo video del WWDC 2012 che mostra come "dipingere con le dita". – matt

+0

Ho iniziato a imparare Objective-c con la creazione di un'app di disegno, pensando a un'immagine con un'area alfa e questa area potrebbe essere irregolare. Voglio solo attirare l'attenzione sull'area alfa quando ho spostato il dito sull'immagine. – bencore

risposta

0

La cosa importante da sapere è che si dovrebbe fare il disegno effettivo nel drawRect: del vostro UIView. Quindi il metodo renderLineFromPoint:toPoint: nel codice dovrebbe essere solo costruendo una serie di linee e dire la fine di ridisegnare ogni volta, qualcosa di simile:

- (void)renderLineFromPoint:(CGPoint)from toPoint:(CGPoint)to 
{ 
    [lines addObject:[Line lineFrom:from to:to]]; 
    [self setNeedsDisplay]; 
} 

Questo presuppone che una classe di linea che ha 2 CGPoint proprietà. Il tuo drawRect: può sembrare qualcosa di simile a questo:

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetRGBStrokeColor(context, 0.0f, 0.0f, 0.0f, 1.0f); 
    for (Line *line in lines) { 
    CGContextMoveToPoint(context, line.from.x, line.from.y); 
    CGContextAddLineToPoint(context, line.to.x, line.to.y); 
    CGContextStrokePath(context); 
    } 
} 

Se lo fate come questo (senza OpenGL) non c'è bisogno di capovolgere l'asse y.

L'unica cosa rimasta è quella di implementare il metodo isPointTransparent:. È difficile sapere dal tuo codice come dovrebbe funzionare.