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?
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