UIBezierPath avc 1px de ligne et de remplissage 1px rectangle de la largeur - des résultats différents.
Ici est un simple dessin
- (void)drawRect:(CGRect)rect
{
//vertical line with 1 px stroking
UIBezierPath *vertLine = [[UIBezierPath alloc] init];
[vertLine moveToPoint:CGPointMake(20.0, 10.0)];
[vertLine addLineToPoint:CGPointMake(20.0, 400.0)];
vertLine.lineWidth = 1.0;
[[UIColor blackColor] setStroke];
[vertLine stroke];
//vertical rectangle 1px width
UIBezierPath *vertRect= [UIBezierPath bezierPathWithRect:CGRectMake(40.0, 10.0, 1.0, 390.0)];
[[UIColor blackColor] setFill];
[vertRect fill];
}
Non rétine 3GS et simulateur de la première ligne est floue, et semble plus large que 1 px, mais la deuxième ligne est croustillant.
Malheureusement, je n'ai ni iPhone4, ni le nouveau iPad pour tester, mais sur la rétine simulateur les deux lignes de la même manière.
Question: Est-ce rectangle à la place de la course le seul moyen d'obtenir le même résultat pour les non rétine et de la rétine appareils?
Vous devez vous connecter pour publier un commentaire.
Vous remplissez l'intérieur du rectangle, mais vous êtes en caressant la ligne du centre. Depuis les coordonnées dans les deux cas (les coins du rectangle et le début et la fin des coordonnées dans la ligne) sont définis comme des valeurs exprimées en nombres entiers (pas de fractions), les coordonnées se trouvent sur le point exact des limites.
J'ai dit "coordonnées" ci-dessus lorsque l'on parle de points de la ligne, à ne pas confondre avec les points sur l'écran. J'ai aussi dit "frontières" au lieu de "les limites des pixels" pour la même raison. iOS définit ses coordonnées et de tous les points dans ce qui est appelé "points" au lieu de pixels. Un point est indépendant de la résolution de la mesure. La fois de la rétine et de la non-retina appareils ont le même nombre de points sur l'écran, c'est juste qu'ils correspondent à un nombre de pixels réels.
Regardons caresser une ligne qui se trouvent sur le point de limites (comme dans votre question), comparativement à remplir un rectangle où les coins se trouvent sur le point de limites:
Dans les illustrations ci-dessous je suis en caressant une ligne avec le noir et le remplissage d'un rectangle avec orange sur les deux non-retina et un écran retina écran. J'ai également décrit la ligne et le rectangle bleu. Dans les deux cas, vous pouvez voir la taille d'un point pour que la résolution et de la comparer à la grille de pixels.
Dans le non-retina cas, vous pouvez voir que le contour de la ligne à partir du centre avec un 1 point de la ligne (dans ce cas, correspondant à 1 pixel de largeur de ligne) serait de remplir la moitié des pixels du haut et à moitié sur les pixels ci-dessous. Parce que les pixels ne sont qu'à moitié rempli, l'opacité de ces pixels sont de 50%. Cette résultats dans la couleur plus claire (sur fond blanc). Depuis deux pixels sur le dessus et ci-dessous sont en partie rempli, caressant le remplit à la fois les pixels sur le dessus et ci-dessous. Ce qui rend la ligne de regard comme si elle est de 2 pixels de large au lieu d'un.
Vous pouvez comparer rapidement que pour le rectangle qui est rempli à l'intérieur.
Le même cas sur une rétine écran est différente. Dans ce cas, la taille d'un point est le même, mais il se compose de 4 pixels au lieu de 1. Cette fois-ci, caressant la ligne, un demi-point au-dessus de la ligne et d'un demi-point en dessous de la ligne sera de remplir complètement la ligne de pixels au-dessus et au-dessous en raison de la résolution élevée de l'écran. Cela signifie que la ligne ressemble comme si c'est 1 point de l'échelle et que la couleur est complètement opaque.
Nous pouvons également voir que le rectangle rempli regarde la même chose.
Pour résoudre ce problème, vous devez mettre les points pour votre ligne sur un demi-pixel. Caressant la ligne du centre sur une faible résolution de l'appareil signifie que la ligne s'étend à un demi-point en haut et un demi-point à la baisse. Depuis le centre de la ligne qui se trouve maintenant au centre des le point, cela signifie que la caresse de la ligne se trouve entièrement à l'intérieur de pixels et la recherche de ligne forte. Faire cela n'aura aucun effet sur la rétine ligne depuis le déplacement vers le bas (ou le haut) d'un demi-point, signifie toujours que vous de bien remplir les pixels au-dessus et au-dessous.
Dans l'illustration ci-dessous (pour la rétine), j'ai montré à la fois le point de la grille et la grille de pixels.
La raison pour laquelle vous obtenez des résultats différents avec de contour et de remplissage est que leurs interprétations des arguments est différent.
Avc ajoute la moitié de la largeur de la ligne de chaque côté de la coordonner. Donc, votre point est 20.0 et la largeur de ligne est 1px. Le résultat sera une de 1 pixel noir de la ligne entre (de 19,5 à 20,5), sur le papier. Car il n'est pas tout nonintegral pixel sur l'écran de l'appareil, il sera converti en 2 pixels en niveaux de gris/ligne floue entre (19-21). pour contourner cela, vous avez besoin de la somme de chacun de vos coordonnées avec 0,5 (comme dans CGPointMake(20.5, 10.5)), de sorte que la largeur ne sera pas divisé entre les pixels les plus.
Cependant, les arguments dans le remplissage sont utilisés pour définir les frontières de la région, à remplir, CGRectMake(40.0, 10.0, 1.0, 390.0) implique une région entre (40 - 41). En conséquence, il n'est pas partie fractionnaire de tomber sur les pixels sur l'aspect flou.