sous-classé UITableViewCell - backgroundView couvre tout ce que je fais dans drawRect
Je suis en train de faire un sous-classé UITableViewCell où je dessine une image dans le coin supérieur droit. J'ai il fonctionne parfaitement sauf que quand j'ai mis l'auto.backgroundView, mon image d'arrière-plan couvre l'image dessinée dans drawRect.
Il doit y avoir un moyen d'être en mesure de définir une image d'arrière-plan (et la selectedBackgroundView) sans couvrir jusqu'à ce qui se fait dans drawRect.
Je suis aller sur ce de la mauvaise façon?
EDIT: j'ai posté un exemple de projet avec le problème.
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) {
//TODO: figure out why this covers up self.starImage that's drawn in drawRect
self.backgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cellBackground.png"]] autorelease];
}
return self;
}
- (void)drawRect:(CGRect)rect {
[self.starImage drawAtPoint:CGPointMake(self.bounds.size.width - self.starImage.size.width, 0.0)];
}
EDIT 2: au AWrightIV demande, voici comment je l'ai eu de travail... qui n'a pas besoin de sous-classement UITableViewCell à tous. Je suis juste en ajoutant une sous-vue à la cellule.backgroundView:
//create a UIImageView that contains the background image for the cell
UIImageView *bgImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cellBackground.png"]];
//create another UIImageView that contains the corner image
UIImage *starRedImage = [UIImage imageNamed:@"starcorner_red.png"];
UIImageView *starImageView = [[UIImageView alloc] initWithFrame:CGRectMake(297,
0,
starRedImage.size.width,
starRedImage.size.height)];
starImageView.image = starRedImage;
//add the corner UIImageView as a subview to the background UIImageView
[bgImageView addSubview:starImageView];
//set cell.background to use the background UIImageView
cell.backgroundView = bgImageView;
Vous devez vous connecter pour publier un commentaire.
Vous n'êtes pas vraiment censé mélanger le dessin avec votre cellulaire, comme ça, vous êtes d'exploitation à un niveau inférieur que le UITableViewCell la machinerie fonctionne, et c'est pourquoi vous obtenez ce problème.
Ce n'est qu'un des divers problèmes que vous sera la fin de la course à pied en. Vous obtiendrez d'autres problèmes que vous aller dans cette voie, y compris des problèmes avec la façon dont la sélection des œuvres.
La bonne approche consiste à créer un personnalisé UIView qui contient le code pour dessiner, et puis vous pouvez addSubView que dans votre cellule de vue de la racine. Qui prendra en charge le rendu dans le bon ordre, et pas interférer avec le système de sélection, et fonctionne correctement dans ce cas.
Vous ne devriez pas ignorer l'-drawRect: d'une tablecell. Au lieu de cela, créez une nouvelle vue personnalisée et l'ajouter à la cellule contentView, et de dessiner dans les là.
Avez-vous essayé d'ajouter un
[super drawRect:rect];
là?Voici une solution qui est un peu une bidouille, mais il correspond exactement à mes exigences... avec une erreur fatale: quand les cellules sont réutilisés, la star du coin s'affiche lorsque je ne veux pas que ça.
http://dl.dropbox.com/u/2349787/UIImage_Position_subclassed_cell2.zip
Je suis toujours à l'aide de drawRect ici, mais seulement parce que soi.starImage est nulle, si vous accéder à l'intérieur de la initWithStyle méthode. Aussi, au lieu d'ajouter la sous-vue de soi.contentView, je suis en ajoutant à l'auto.backgroundView pour empêcher la cellule de bouton de suppression d'interférer avec elle. La star coin est correctement positionné en mode portrait et en mode paysage, et fonctionne très bien dans le mode edit en tant que bien.
Avec la cellule de réutilisation problème cependant, C'est toujours un pas aller... donc, peut-être que je suis de retour pour essayer de le faire sans sous-classement UITableViewCell.
Je suis ouvert à toutes autres suggestions. Merci!!!!
addSubview:
à l'intérieur dedrawRect:
n'est pas une bonne idée parce quedrawRect:
sera appelé à plusieurs reprises.