Arrondi des CGFloat et retina
colas_
Membre
Bonjour à tous !
Si j'ai bien compris les choses, sur un écran retina, un pixel peut avoir des coordonnées demi-entières.
Est-ce du coup, à votre avis, ça peut valoir le coup de créer une fonction :
En gros, quand c'est du retina, ça va transformer 42.6 en 42.5.
Sinon, ça va transformer 42.6 en 42.
CGFloat floorClever_cbd_(CGFloat aFloat)
{
/*
Semi-entire or entire coordinate
*/
CGFloat factor = 1.0f ;
#if TARGET_OS_IPHONE
factor = [[UIScreen mainScreen] scale] ;
#endif
/*
Flooring
*/
CGFloat result ;
#if CGFLOAT_IS_DOUBLE
if (factor < 1.1)
{
result = floor(aFloat) ;
}
else
{
result = floor(aFloat * factor) / factor ;
}
#else
if (factor < 1.1)
{
result = floorf(aFloat) ;
}
else
{
result = floorf(aFloat * factor) / factor ;
}
#endif
return result ;
}
PS : cette fonction est compatible osx mais ne gère pas les écrans retina osx.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Du coup, tu ne fais pas des floor() quand tu calcules des coordonnées ?
Exemples : mettre une vue au tiers d'une autre ; centrer une vue dans une autre.
Du coup c'est rare que j'utilise des CGFloat et autres CGRect pour positionner des vues à l'écran. Et les rares fois où je le fais, je ne m'embête pas forcément à arrondir le subpixelling se débrouille pour faire l'antialiasing tout seul.
Les rares fois où je fais gaffe au subpixelling c'est plutôt pour quand j'ai de la composition d'images à faire, par exemple ce que j'ai fait pour mon pod OHPDFImage où il faut " comme tu as vu dans les issues que tu as ouvertes :P " être sûr de correctement aligner l'image, son masque, etc... sans quoi on risque des bordures fines qui dépassent. Mais dans ce cas, c'est du dessin sur un contexte graphique, donc normalement ça ne dépend pas forcément du scale du UIScreen de toute façon car tu dessines pas tes 2 images superposées directement à l'écran, mais sur une image...