2012-03-31 14 views
9

Soy un principiante en la programación de iOS, lo siento si mi pregunta es una pregunta estúpida.UIView subclase: drawRect no se llama

Estoy tratando de hacer una aplicación que realice dibujos personalizados en una imagen cargada.

Para hacerlo, descubrí que una solución es la subclase UIView y edito el método drawRect.

Lo hice en el siguiente código que se activa en un IBAction vinculado a un botón en el archivo del guión gráfico del 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 es el UIView subclase que he creado, cuya init y drawRect métodos se establecen así:

- (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); 
} 

El problema que tengo es que no se hace ningún dibujo y en NSLog tengo la Mensaje "INICIALIZANDO", pero no el dibujo "DIBUJO".

Básicamente hace el initWithFrame, pero no llama al método drawRect.

¿Podría indicarme qué estoy haciendo mal?

Respuesta

5

Paolo,

Aquí están algunas cosas que usted puede intentar:

  1. en initWithFrame, compruebe que la variable frame contiene lo que esperaría que: NSLog(@"Frame: %@", NSStringFromCGRect(frame));
  2. Intente llamar [preview setNeedsDisplay]; después de agregarlo a su super visión

Por último, cambiaría

image.frame = previewView.frame;

con:

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

+0

Gracias, al poner el NSLog, descubrí que había algo mal en la llamada del método drawRect. Al agregar [previewView setNeedDisplay] se llama al método, pero no cuando espero que se haga. Es decir, al seguir los pasos del código, la ejecución de la línea [previewView setNeedDisplay] no hace que aparezca el dibujo personalizado, sino que aparece más tarde de alguna manera. Me gustaría saber en qué momento se llama al método drawRect, pero de todos modos el problema inicial está resuelto, gracias :) – Dobrodeveloper

13
  1. Asegúrese de que su nueva clase de vista es la subclasificación del UIView, no el UIImageView.
  2. Para asegurarse de que aparezca la nueva vista, necesitará hacer [viewContainer addSubView:] para hacer que se llame al drawRect.

Ref desde el doc:

La clase UIImageView está optimizado para dibujar sus imágenes para la pantalla. UIImageView no llamará drawRect: una subclase.Si su subclase necesita un código de dibujo personalizado, se recomienda utilizar UIView como clase base.

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

+0

puede establecer la clase personalizada que anule el dibujado rect al codificador – Subhash

2

puede ser la pregunta es marco de aCustomView es (0,0,0,0).
Puede intentar pasar un parámetro de CGRect constante, como este: CGRectMake(5, 5, 100, 100)。

Cuestiones relacionadas