42 votes

drawRect ne pas être appelé dans ma sous-classe de UIImageView

J'ai sous-classé UIImageView et a essayé de remplacer drawRect afin que je puisse dessiner sur l'image à l'aide de Quartz 2D. Je sais que c'est une stupide question de newbie, mais je ne vois pas ce que j'ai fait de mal. Voici l'interface:

#import <UIKit/UIKit.h>

@interface UIImageViewCustom : UIImageView {

}
- (void)drawRect:(CGRect)rect;
@end

Et la mise en œuvre:

#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

J'ai mis un point d'arrêt sur drawRect et il n'est jamais arrivé, m'amenant à penser qu'il n'est jamais appelée à tous. N'est-il pas censé être appelé lors de l'affichage de la première charge? Ai-je tort remplacé?

87voto

Mark Bessey Points 13931

Il ne fera que s'appelle si la vue est visible, et sale. Peut-être que le problème est le code qui crée la vue, ou dans votre Plume, si c'est la façon dont vous êtes en train de créer cela?

Vous aurez aussi parfois voir des points d'arrêt à défaut de se mettre correctement si vous essayez de déboguer une "Libération" de construire.


J'ai un peu raté la première fois que vous êtes sous-classement UIImageView. À partir de la documentation:

Considérations Spéciales

Le UIImageView classe est optimisé pour tirer ses images à l'écran. UIImageView ne vais pas appeler drawRect: un sous-classe. Si votre sous-classe doit code de dessin personnalisé, il est recommandé vous utilisez UIView comme la classe de base.

Donc là vous l'avez. Étant donné la façon dont il est facile de dessiner une image dans votre point de vue à l'aide de [UIImage drawInRect:], ou en utilisant CALayer, il n'y a probablement pas de bonnes raisons à la sous-classe UIImageView de toute façon.

1voto

AppUs Points 6156

Essayez d'ajouter

réviser:

dans votre code.

j'espère que cela aide.

merci

madhup

1voto

iXcoder Points 543

Je suppose que l'UIImageView ne peut pas utiliser pour remplacer drawRect

0voto

jasoncrawford Points 1492

Ne pas répondre directement à votre question, mais peut résoudre votre problème:

Pourquoi le faire avec une sous-classe d'UIImageView ? La sous-classiage peut toujours être problématique, en particulier pour les classes qui ne sont pas conçues pour être sous-classées - et je parie que UIImageView ne l'est pas. Si vous voulez juste dessiner des choses sur le dessus d'une image, puis créer une vue avec un fond transparent, dessiner ce que vous voulez, et le placer directement sur l'image.

0voto

Kyle Clegg Points 8441

En fonction de votre cas particulier, il peut être utile d'utiliser un UIButton avec une image d'arrière-plan au lieu d'une UIImageView. Vous pouvez même définir userInteractionEnabled PAS et le résultat serait impossible à distinguer d'un UIImageView.

Dans ce cas, votre UIButton sous-classe serait tout simplement inclure:

- (void)drawRect:(CGRect)rect
{
  if (kSomethingSpecial) {
    [self setBackgroundImage:[UIImage imageNamed:@"RedBackground.png"] forState:UIControlStateNormal];
  }
}

Avertissement - je ne le recommande si vous avez des plans pour utiliser l'image comme un bouton au moins de temps en temps. Je ne peux pas souscris sans réserve à l'aide d'un UIButton comme une solution de contournement pour ce drawRect comportement dans UIImageView, je suis sûr que Apple a ses raisons pour l'écriture de leur API de cette façon, comme la Marque de référence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X