iphone - vuelve - zme destiny 2
drawRect no se llama en mi subclase de UIImageView (5)
He subclasificado UIImageView y he intentado anular drawRect para poder dibujar sobre la imagen usando Quartz 2D. Sé que esta es una pregunta de novato tonto, pero no veo lo que hice mal. Aquí está la interfaz:
#import <UIKit/UIKit.h>
@interface UIImageViewCustom : UIImageView {
}
- (void)drawRect:(CGRect)rect;
@end
Y la implementación:
#import "UIImageViewCustom.h"
@implementation UIImageViewCustom
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
}
return self;
}
- (void)drawRect:(CGRect)rect {
// do stuff
}
- (void)dealloc {
[super dealloc];
}
@end
Establecí un punto de interrupción en drawRect
y nunca llega, lo que me lleva a pensar que nunca se llama en absoluto. ¿No se supone que debe llamarse cuando se carga la vista por primera vez? ¿Lo he anulado incorrectamente?
Dependiendo de su caso específico, podría tener sentido utilizar un UIButton
con una imagen de fondo en lugar de un UIImageView
. Incluso podría establecer userInteractionEnabled
en NO y el resultado sería indistinguible de un UIImageView.
En este caso, su subclase UIButton
simplemente incluiría:
- (void)drawRect:(CGRect)rect
{
if (kSomethingSpecial) {
[self setBackgroundImage:[UIImage imageNamed:@"RedBackground.png"]
forState:UIControlStateNormal];
}
}
Descargo de responsabilidad: solo recomendaría esto si tiene planes de usar la imagen como botón al menos parte del tiempo. No puedo aprobar de todo corazón el uso de un UIButton
como una solución para este comportamiento drawRect en UIImageView
, ya que estoy seguro de que Apple tiene sus razones para escribir su API de esta manera, como Mark hizo referencia.
No responde directamente a su pregunta, pero puede resolver su problema:
¿Por qué hacer esto con una subclase de UIImageView? Subclasificar siempre puede ser problemático, especialmente para las clases que no están diseñadas para ser subclasificadas, y apuesto a que UIImageView no lo es. Si solo quieres dibujar cosas sobre una imagen, crea una vista con un fondo transparente, dibuja lo que quieras y colócala directamente sobre la imagen.
Solo se llamará si la vista es visible y está sucia. Tal vez el problema esté en el código que crea la vista, o en su Nib, si así es como lo está creando.
A veces también verá que los puntos de interrupción no se configuran correctamente si está tratando de depurar una compilación "Release".
De alguna manera me perdí la primera vez que estás subclasificando UIImageView. De la documentación:
Consideraciones Especiales
La clase UIImageView está optimizada para dibujar sus imágenes en la pantalla. UIImageView no llamará a drawRect: en una subclase. Si su subclase necesita código de dibujo personalizado, se recomienda utilizar UIView como clase base.
Así que ahí lo tienen. Dado lo fácil que es dibujar una imagen en su vista con [UIImage drawInRect:], o con CALayer, probablemente no haya una buena razón para subclase UIImageView.
Supongo que UIImageView no se puede usar para anular drawRect
Tratar de agregar
Editar:
- (id)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
[self setClearsContextBeforeDrawing:YES];//add this line also
}
return self;
}
- (void)setNeedsDisplay{
[self setNeedsDisplayInRect:self.frame];
}
en su código.
espero que esto ayude.
Gracias,
madhup