Donc, j'ai une sous-classe UIView personnalisée qui permet de dessiner des bords arrondis. La chose attire parfaitement, mais l'arrière-plan remplit toujours toutes les limites, malgré l'affûtage d'un chemin d'abord. La frontière dessine également au-dessus de l'arrière-plan rectangulaire, malgré le fait que je dessine la frontière dans Drawrect: avant le fond. J'ai donc enlevé toute la teneur en tout drawrect:, qui est maintenant pratiquement vide - néanmoins l'arrière-plan est dessiné! P>
Quelqu'un une explication à cela? Je définit le bassin arrière-plan dans le constructeur d'interface. Merci! P>
6 Réponses :
Ceci est facilement reproductible: p>
Créer une nouvelle application iPhone basée sur la vue. Créez une sous-classe UIView et laissez la méthode Thrawrect: méthode complètement vide. Dans l'interface Builder, faites glisser un UIView dans la vue principale, attribuez-la une couleur d'arrière-plan et définissez la classe de la vue sur votre sous-classe. Enregistrer, construire et exécuter, et voir, la vue indique la couleur de fond. P>
J'ai contourné ce comportement en faisant preuve de plongée à dosercolor: et en attribuant la couleur à mon propre ivar, laissant toujours la propriété de l'arrière-plan Nil. Cela fonctionne, mais je me demande toujours pourquoi cela fonctionne de cette façon. P>
Désolé pour ce monologue. :)
La chose est que la couche UIVIEW apparaît apparemment l'arrière-plan, qui est indépendant de Vous pouvez soit remplacer par remplacement Définissez une variable d'instance pour maintenir votre couleur d'arrière-plan, par exemple. mybackgroundColor em>. Dans vos méthodes init, définissez la couleur de fond réelle pour être le ClearColor: p> remplacement: p> puis utiliser < em> mybackgroundColor em> dans votre thrake: méthode. De cette façon, vous pouvez utiliser la couleur attribuée à partir d'Interface Builder (ou XCode4) dans votre code. P> P> Drawrect: code>. C'est la raison pour laquelle vous ne pouvez pas vous débarrasser de l'arrière-plan en remplacement
Drawrect: code>. P>
- (void) Drawlayer: (Calayer *) COUCHE INCONText : (CGContextref) CTX CODE> et faire dessiner le calque, tout ce que vous voulez, ou que vous remplacez
- (void) Setgrackcolor: (uicolor *) newColor code> et n'identifie pas newcolor Em> à BackgroundColor em>, mais à votre propre ivar, comme mybackgroundColor em>. Vous pouvez ensuite utiliser MyBackgroundColor em> Drawrect; Pour dessiner le fond, mais vous aimez. p>
setbackgroundColor: p> p>
J'hésite à suggérer cela parce que je ne veux pas vous offenser, mais avez-vous défini opaque à non? p>
Aucune infraction prise, la question est en réalité une bonne chose: oui, Opaque a été défini sur non. :)
Parfois, c'est aussi simple ... merci!
Voici une solution plus facile:
self.backgroundColor = [UIColor clearColor];
Oui, c'est ce qui est accompli en reconvertissant des fredackcolor :. Je me demandais plus pourquoi quelque chose a été tiré du tout, malgré le drawrect: être vide. La réponse était que l'arrière-plan est tiré dans DrawLayer: Incontext :.
Vous devez définir C'est aussi simple. p> de la UIView Références Documents P> Oups. J'ai mal compris la question. L'OP (affiche originale) veut que leur contrôle personnalisé prend en charge la propriété standard "BackgroundColor" (par exemple, définie par le concepteur de l'interface graphique), mais ne veut pas que le système peigne cette couleur. L'OP veut peindre le BG lui-même pour qu'il puisse arrondir les coins. P> Dans ce cas, le poste d'approximation du dessin de niveau de couche est correct. P> La solution que j'ai postée empêcher le système d'interface utilisateur d'effacer votre tampon avant de dessiner. Lorsque vous n'avez pas de BG défini, si ClearScontextBeforeRawing est défini, l'IOS effacera la mémoire tampon de votre vue, en définissant tous les pixels en noir transparent. Faire cela pour une vue en plein écran prend environ 5 ms dans un iPad3, il n'est donc pas gratuit (poussant que 2048x1536 pixels ne sont jamais). Pour la comparaison Dessin, un bitmap de plein écran (à l'aide de KCGBLendModecopy pour forcer le blitting) prend environ 25 ms (à l'aide de quartz, pas de GPU). P> P>
Cela n'empêche pas le fond de l'arrière-plan étant tiré; Au moins pas im mon test rapide.
Que se passe-t-il si vous êtes déséquipuléColor?
Ensuite, cela fonctionne, c'est pourquoi j'ai choisi de remplacer setbackgroundColor: code> pour définir aucune couleur sur super et enregistrer la couleur d'arrière-plan à ma propre ivar. De cette façon, la couleur d'arrière-plan attribuée dans l'interface Builder est utilisée dans ma personnalisation
Drawrect: code> et je n'ai pas à gérer cela dans le code. :)
Oh je vois. Votre contrôle personnalisé souhaite prendre en charge la propriété standard "BackgroundColor", mais ne veut pas que le système peigne cette couleur. Vous voulez peindre le BG vous-même pour que vous puissiez tourner les coins. Désolé, ce n'était pas clair au début.
S'il est possible de remplacer le code qui copie la couleur d'arrière-plan dans la couche de la vue, je ne suis pas un fan de cette approche. Je crois que cela peut causer des problèmes avec des vues destinés à être opaques. Ma suggestion est de créer une variable de couleur personnalisée comme celle-ci: MAINTENNE, définissez l'arrière-plan CODE> de votre vue CODE> pour effacer et utiliser Une autre alternative consiste à utiliser le ForfildColor code> dans votre Code de dessin à sa place. Le code ci-dessus prend en charge la mise à jour lorsque la valeur change et l'expose également au générateur d'interface si nécessaire. P>
TintColor code> de votre vue et pour vous assurer que qu'il met à jour correctement lorsque la couleur de teinte change. Vous pouvez vous réserver une couleur de teinte pour d'autres utilisations, donc ce n'est pas nécessairement idéal. Si vous utilisez
TintColor code>, n'oubliez pas d'inclure les éléments suivants: P>
override func tintColorDidChange() {
setNeedsDisplay()
}
C'est probablement un problème avec votre code de dessin. Pouvez-vous le poster afin que nous puissions jeter un coup d'oeil? Je suppose que c'est que quelque part vous dessinez d'une manière qui ignore les valeurs alpha ou attire quelque chose d'opaque sur ce que vous pensiez attiré. En outre, juste pour vous assurer que lorsque vous définissez le bouton code> code>, vous avez le jeu alpha de manière appropriée?
Eh bien, je peux poster mon drawrect :, mais comme je l'ai dit, il est complètement vide: