2012-03-31 13 views
9

Sono un principiante nella programmazione iOS, mi dispiace se la mia domanda è una domanda stupida.Sottoclasse UIView: drawRect non chiamato

Sto provando a creare un'app che esegue il disegno personalizzato su un'immagine caricata.

Per riuscirci, ho scoperto che una soluzione è la sottoclasse UIView e modificare il metodo drawRect.

L'ho fatto sul seguente codice che si attiva su un IBAction collegato a un pulsante nel file storyboard di Interface Builder.

UIImageView *image = [[UIImageView alloc] initWithImage: [UIImage imageNamed:  @"SampleImage.jpg"]]; 
image.frame = previewView.frame; 
[image setContentMode:UIViewContentModeScaleAspectFit];  

[previewView addSubview:image]; 

customView *aCustomView = [[customView alloc] initWithFrame: CGRectMake(image.bounds.origin.x, image.bounds.origin.y, image.bounds.size.width, image.bounds.size.height)]; 
[previewView addSubview:aCustomView]; 

customView è la UIView sottoclasse che ho creato, il cui init e drawRect metodi sono impostati in questo modo:

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    NSLog(@"INITIALIZING"); 
    if (self) { 
     // Initialization code 
     [self setBackgroundColor:[UIColor clearColor]]; 
    } 
    return self; 
} 


- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    NSLog(@"DRAWING"); 

    CGContextClearRect(ctx, rect); 

    CGContextSetRGBFillColor(ctx, 0, 255, 0, 0.3); 
    CGContextFillEllipseInRect(ctx, rect); 

    CGContextSetRGBStrokeColor(ctx, 255, 0, 0, 1); 
    CGContextSetLineWidth(ctx, 2); 
    CGContextStrokeEllipseInRect(ctx, rect); 
} 

Il problema che ho è che nessun disegno è fatto e su NSLog ho la Messaggio "INITIALIZING", ma non il disegno "DRAWING".

Quindi in pratica rende initWithFrame, ma non chiama il metodo drawRect.

Potrebbe per favore indicarmi cosa sto sbagliando?

risposta

5

Paolo,

qui ci sono alcune cose che potete provare:

  1. in initWithFrame, verificare che la variabile frame contiene quello che ci si aspetta a: NSLog(@"Frame: %@", NSStringFromCGRect(frame));
  2. Provare a richiamare [preview setNeedsDisplay]; dopo averlo aggiunto alla sua superview

Infine, cambierei

image.frame = previewView.frame;

con:

image.bounds = CGRectMake (0, 0, previewView.frame.size.width, previewView.frame.size.height);

+0

Grazie, inserendo NSLog ho scoperto che c'era qualcosa di sbagliato nella chiamata del metodo drawRect. Aggiungendo [previewView setNeedDisplay] il metodo viene chiamato ma non quando mi aspetto che sia fatto. Voglio dire, seguendo i passaggi del codice l'esecuzione della riga [previewView setNeedDisplay] non fa apparire il disegno personalizzato, ma appare in un secondo momento. Mi piacerebbe capire in quale momento viene chiamato il metodo drawRect, ma in ogni caso il problema iniziale è risolto, grazie :) – Dobrodeveloper

13
  1. Assicurarsi che la nuova classe di vista è sottoclasse UIView, non l'UIImageView.
  2. Per assicurarsi che la nuova vista sia visualizzata, è necessario fare [viewContainer addSubView:] per ottenere il drawRect da chiamare.

Rif dalla doc:

La classe UIImageView è ottimizzato per disegnare le sue immagini al display. UIImageView non chiamerà drawRect: una sottoclasse.Se la sottoclasse necessita di codice di disegno personalizzato, si consiglia di utilizzare UIView come classe base.

https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIImageView_Class/Reference/Reference.html

+0

puoi impostare la classe personalizzata che sovrascrive il rect draw per coder – Subhash

2

può essere la domanda è struttura di aCustomView è (0,0,0,0).
Puoi provare a passare un parametro CGRect costante, come questo: CGRectMake(5, 5, 100, 100)。

Problemi correlati