2010-01-30 5 views
4

J'ai fait une vue « Circle » avec ce drawRectMise à l'échelle des iPhone « graphiques vectoriels » sur affines transforme

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 

    CGContextSetFillColorWithColor(ctx, color.CGColor); 
    CGContextAddEllipseInRect(ctx, rect); 
    CGContextFillPath(ctx); 
} 

Lorsque je tente d'escalader la vue à l'aide CGAffineTransformMakeScale(2.0, 2.0), le résultat est floue et pixélisée sur les bords. Cependant, le guide de programmation indique que Quartz utilise des commandes vectorielles pour dessiner des vues et qu'elles continueront à être belles lors de l'utilisation de transformations affines:

Le système de dessin Quartz utilise un modèle de dessin vectoriel. Par rapport à un modèle de dessin raster, dans lequel les commandes de dessin fonctionnent sur des pixels individuels, les commandes de dessin dans Quartz sont spécifiées à l'aide d'un espace de dessin à échelle fixe, appelé espace de coordonnées utilisateur. iPhone OS mappe alors les coordonnées dans cet espace de dessin sur les pixels réels de l'appareil. L'avantage de ce modèle est que les graphiques dessinés à l'aide de commandes vectorielles continuent de bien paraître lorsqu'ils sont redimensionnés à l'aide d'une transformation affine.

Ou est-ce que je n'utilise pas de commandes vectorielles? Sinon, comment ferais-je cela pour dessiner un cercle?

Merci.

Répondre

5

L'application d'une transformation à une vue ne provoque pas son redessin. Tout ce qu'il fait est l'échelle de la couche de la vue, qui est une texture bitmap stockée sur le GPU. Cela conduira à des graphiques flous.

Lorsque vous dessinez une vue sur l'iPhone, -drawRect: est appelée pour fournir le contenu de la couche de la vue. Ce contenu est ensuite mis en cache en tant que texture sur le GPU. Ce à quoi ils se réfèrent dans le guide est l'application d'une transformée pendant le retrait:, lorsque les graphiques vectoriels sont dessinés. Si vous utilisez une transformation là (par CGContextConcatCTM() ou similaire), le cercle sera dessiné doucement à la plus grande échelle. Cependant, vous devrez également redimensionner votre vue pour refléter cette forme plus grande. Je recommande d'utiliser une propriété scale dans votre sous-classe d'affichage personnalisé, que vous pouvez définir sur un facteur d'échelle différent et qui permettra de redimensionner la vue et de redessiner son contenu de manière nette.

+0

Merci beaucoup, bonne explication. – Dan

0

Cela dépend de l'application de la transformation de mise à l'échelle. Si vous le dessinez en premier, faites alors la transformation de l'échelle, puis elle apparaîtra pixélisée (parce qu'elle a été mise à l'échelle après le dessin). Si vous faites l'échelle avant de faire la routine de dessin, je m'attendrais à ce que cela fonctionne comme prévu.

Alors oui, vous utilisez des commandes vectorielles pour y parvenir; Je pense que c'est un problème de commande. Quand faites-vous la transformation et le dessin?

+0

Merci pour votre réponse. À ma connaissance, faire une transformation rend l'idée de se redessiner par la suite malgré tout. Mais j'ai quand même essayé de faire un [circle setNeedsDisplay] après la transformation et cela n'a rien changé, ni de régler la transformation avant de faire le tirage. – Dan

+0

Pouvez-vous poster le code où vous définissez la transformation? – AlBlue

+0

La modification de la matrice de transformation après le dessin n'affecte pas ce que vous avez déjà dessiné. L'état graphique ne fonctionne pas de cette façon. Je veux quand même voir le code avec les instructions changeant de CTM dedans, cependant. –

0

Vous pouvez essayer d'appeler setNeedsDisplay après la transformation, je ne sais pas si cela va fonctionner ou non, mais ça vaut le coup.

+0

Non, ne change rien. – Dan

Questions connexes