12
votes

Calayer Drawincontext ne peut pas dessiner des lignes 1PX sur des écrans de rétine

Je veux dessiner une ligne de couleur double avec des lignes de 1px de 2 couleurs différentes. J'ai beaucoup de code, donc je le mettez après avoir essayé d'expliquer.

Si j'utilise UIView Drawrect code> Méthode Ça fonctionne bien lorsque je désactive l'antialiasing, mais quand j'utilise DrawLayerIntext CODE> Il affiche une ligne unie ou 2 lignes de ligne simples de 2 px avec une antialiasing OFF ou deux lignes demi-transparentes de 2px avec antialisations sur. P>

J'ai réussi à obtenir un comportement similaire à la méthode Traushie de UIVIEW En créant une image avec un contexte personnalisé où je peux spécifier une échelle: p> xxx pré>

Je voudrais juste savoir pourquoi je ne reçois pas le même comportement dans Drawincontext code> et s'il y avait un moyen d'obtenir un comportement similaire. p>

Voici le code qui dessine la ligne de couleur double: p> xxx pré>

avec le Drawrect code> Méthode de UIView code> i Obtenir ceci: P>

-(void)display{

    if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
        UIGraphicsBeginImageContextWithOptions([self bounds].size, NO, 0.f); // 0.f for scale means "scale for device's main screen".
    } else {
        UIGraphicsBeginImageContext([self bounds].size);
    }

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGPoint startPoint = CGPointMake(0, 5.25);
    CGPoint endPoint = CGPointMake(CGRectGetMaxX(self.bounds),5.25);
    UIColor* topLineColor = [UIColor whiteColor];
    UIColor* bottomLineColor = [UIColor blackColor];

    DRAW_DOUBLE_LINE(ctx, startPoint, endPoint, topLineColor, bottomLineColor);

    UIImage *coloredImg = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    self.contents = (id)coloredImg.CGImage;
}


1 commentaires

Avez-vous essayé de changer contenu ?


4 Réponses :


0
votes

Je suggérerais au lieu de dessiner des lignes, viennent de dessiner des rectangles remplis de la taille souhaitée. L'une des parties difficiles avec différentes résolutions est l'emplacement des points de départ et de fin des lignes. Mais les rectangles de dessin sont beaucoup plus faciles.

Les coordonnées des rectangles sont toujours, car vous ciblez le bord et non le centre d'un pixel.


0 commentaires

0
votes

Dessinez et remplissez les rectangles au lieu des lignes. Les coordonnées des rectangles doivent toujours être au bord d'un pixel et non du centre.


0 commentaires

1
votes

n'utilisez pas 0,5 comme la largeur.

Remplacer 0.5 avec 1.0 / [UISREEN Mainscreen] .cale

Lorsque vous dessinez sur la couche, vous pouvez obtenir une ligne de largeur de 1 pixel.


0 commentaires

0
votes

La meilleure façon de recevoir des lignes précises / croquantes sur 1PX sur la rétine / non-rétine et les maintenir comme 1px même si vous effectuez un zoom avant pour écrire un shader. Dans mon cas, j'utilisais OpenGL, mais je crois que vous pourriez le faire avec du métal pour les calaiseurs. Le processus de base consiste à dessiner un rectangle de hauteur zéro (ou de largeur zéro si votre ligne est verticale), puis dans le shader pousse ces points vers l'extérieur par le nombre de pixels souhaité.

J'ai eu l'idée d'ici: https://www.mapbox.com/ Blog / Dessin-Antialiased-Lines /


0 commentaires