6
votes

Sous-classement UitailViewCell - ContexteView couvre tout ce que je fais dans Drawrect

J'essaie de faire une sous-classement uableviewCell où je dessine une image dans le coin supérieur droit. Je travaille parfaitement - sauf lorsque je mets Self.backgroundview, ma image d'arrière-plan couvre l'image dessinée dans Drawrect.

Il doit y avoir un moyen de pouvoir définir une image de fond (et la sélection de plans de sélection) sans couvrir ce qui est Être fait dans Drawrect. P>

Est-ce que je vais à ce sujet dans la mauvaise voie? p>

Edit: J'ai posté un Exemple de projet avec le problème . P>

// 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;


0 commentaires

4 Réponses :


1
votes

Avez-vous essayé d'ajouter un [super drawrect: rect]; là-bas?


1 commentaires

Je viens d'essayer de l'ajouter, mais cela n'avait aucun effet. J'apprécie cependant la suggestion.



4
votes

Vous ne devriez pas remplacer le -Drawrect: d'une nappe. Au lieu de cela, créez une nouvelle vue personnalisée et ajoutez-la à la Cell's ContentView et y attirez-vous.


1 commentaires

Le problème avec cela, c'est si je balaye pour supprimer la cellule, le bouton Supprimer pousse mon image "Star Corner" à gauche - c'est pourquoi j'ai fini par essayer d'utiliser Drawrect. Je vais jouer avec cela un peu plus cependant, au cas où j'ai manqué quelque chose. Merci.



9
votes

Vous n'êtes pas vraiment censé mélanger le dessin avec votre cellule comme celle-ci, vous opérez à un niveau inférieur à celui de l'utableviewcell Machinery fonctionne et c'est pourquoi vous obtenez ce problème.

Ce n'est que l'un des différents problèmes que vous allez finir. Vous rencontrez d'autres problèmes lorsque vous descendrez ce chemin, y compris des problèmes de fonctionnement de la sélection.

L'approche appropriée consiste à créer un UIView personnalisé contenant le code à dessiner, puis vous pouvez modifier la vue de la racine de votre cellule. Cela s'occupera du rendu dans la commande appropriée et n'interférera pas avec le système de sélection et fonctionnera correctement dans ce cas.


5 commentaires

Par "Cell's Root View", voulez-vous dire cellule.contentview? Lorsque j'ai essayé une personnalité UIView (ou UiImageView), j'ai des problèmes avec le bouton Supprimer de la cellule en poussant la vue à gauche. J'utilise UIViewAworesizeFlexiBleleftmargin sur la vue personnalisée car j'essaie de prendre en charge le mode paysage et que vous souhaitez que l'image d'angle étoile soit toujours fixée au coin supérieur droit de la cellule. (De plus, j'ai besoin de supporter le mode d'édition et la réorganisation).


Assurez-vous que votre vue prend en charge le protocole de redimensionnement en mettant en œuvre la méthode LayouTouSubviews de la classe UIView. Cette méthode sera invoquée avec la nouvelle taille si l'interface utilisateur tourne ou si l'édition est en cours. Il suffit d'ajuster les limites ou les cadres de sous-espion.


J'ai compris comment le faire sans sous-classement l'Uitabiliewcell. Tout ce dont j'avais besoin était de créer une vision d'image avec l'étoile, puis ajoutez-la sous forme d'une sous-système à une vue d'ensemble d'images avec l'image de fond de cellule - et d'attribuer enfin que sur mon Cell.background (pas le contenuview). Donc, merci et Ben pour m'éloigner de la solution Drawrect et me dirigez-vous dans la bonne direction. J'ai beaucoup appris, et maintenant, il semble facile de rétrospecter.


@Jawboxer Y a-t-il une façon de poster votre nouveau code afin que nous puissions le comparer à votre code d'origine? Je comprends que cela a été un an, donc pas de soucis si c'est enterré.


@AwrightIV J'ai édité la question pour ajouter le code que j'ai utilisé pour le faire fonctionner. (essentiellement après les suggestions de Miguel et Ben)



-2
votes

Voici une solution qui est un peu d'un kludge, mais cela correspond exactement à mes besoins ... avec une faille fatale: lorsque les cellules sont réutilisées, le coin étoile s'affiche quand je ne le veux pas.

< Un href = "http://dl.dropbox.com/u/2349787/uiImage_position_subclassed_cell2.zip" rel = "nOfollow NOREFERRER"> http://dl.dropbox.com/u/2349787/uiImage_position_subclassed_cell2.zip

J'utilise toujours drawrect ici, mais seulement parce que Self.StarImage est null si vous y accédez dans la méthode InitwithStyle. En outre, au lieu d'ajouter la sous-vue à Self.contentview, je l'ajoute à Self.backgroundview pour empêcher le bouton Supprimer de la cellule d'interférer avec elle. Le coin étoile est positionné correctement en mode portrait et paysage et fonctionne également correctement en mode édition.

avec la question de la réutilisation de la cellule, c'est toujours un non go ... alors, peut-être que je suis Retour à l'essai de le faire sans sous-classement UitailViewCell.

Je suis ouvert à toute suggestion supplémentaire. Merci! xxx


1 commentaires

Calling AddSubView: Intérieur Drawrect: n'est pas une bonne idée car Drawrect: sera appelé plusieurs fois.