UIView drawRect le dessin des lignes de mal largeur
J'essaye d'ajouter une petite ligne rouge sur le bas de mon UIView.
Je veux la ligne à un 1px ligne.
Quelqu'un peut me dire pourquoi le code suivant:
- (void)drawRect:(CGRect)rect {
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextSaveGState(currentContext);
CGContextSetRGBFillColor(currentContext, 0.0f, 0.0f, 0.0f, 1.0f);
CGContextFillRect(currentContext, RECT(0, 0, rect.size.width, rect.size.height - 8));
CGContextSetLineWidth(currentContext, 1);
CGContextSetRGBStrokeColor(currentContext, 1.0f, 0.0f, 0.0f, 1.0f);
CGContextBeginPath(currentContext);
CGContextMoveToPoint(currentContext, 0, rect.size.height - 7);
CGContextAddLineToPoint(currentContext, rect.size.width, rect.size.height - 7);
CGContextStrokePath(currentContext);
CGContextRestoreGState(currentContext);
}
Dessine une ligne qui s'étend sur 2px en hauteur?
OriginalL'auteur almosnow | 2010-09-07
Vous devez vous connecter pour publier un commentaire.
L'intégrale coordonnées indiquent des lieux à mi-chemin entre les pixels, c'est, (0,0) est le coin supérieur gauche, ci-dessus et à gauche du pixel supérieur gauche; de même, (1,0) est entre les premier et deuxième pixels; enfin, (0.5,0.5) est au centre du pixel supérieur gauche.
Selon la documentation pour CGContextSetLineWidth, "quand le caressa, la ligne est à cheval sur le chemin, avec la moitié de la largeur totale de chaque côté." Ainsi, si le chemin est couché précisément entre les pixels, la ligne sera caressa la moitié sur une ligne de pixels, à moitié sur l'autre.
Par conséquent, pour obtenir une forte pixel de la ligne, vous devez compenser vos coordonnées par un demi-pixel: pour votre
x
les coordonner, de les utiliserrect.size.height - 7.5
au lieu de- 7
.Par la route, lors de dessiner des rectangles, il est pratique d'utiliser la
CGRectInset(rect, 0.5, 0.5)
pour atteindre cet objectif.OriginalL'auteur David M.
Utilisez-vous un iPhone 4? L'iPhone 4 utilise un système de coordonnées avec un facteur d'échelle de 2. Donc, vous devez définir la largeur de la ligne à 0,5 pour obtenir ce que vous voulez.
(Le système de coordonnées est défini de cette façon, de sorte que le même code produit le même résultat sur tous les modèles.)
OriginalL'auteur Codo
Lignes sont par défaut attiré l'anticrénelage (sauf si vous configurez l'autre). Ainsi, toute la ligne qui n'est pas strictement verticale ou à l'horizontale, en commençant et se terminant sur un pixel sera probablement couvrir une partie de plusieurs pixels en quelques lignes et/ou colonnes, pour la faire ressembler à un plus large ligne grise au lieu d'un mince plus de contraste en ligne.
OriginalL'auteur hotpaw2