Créer un cercle ou un disque avec anti-crénelage pour l'affichage de la rétine

J'ai créé un cercle en utilisant CGContextFillEllipseInRect de CoreGraphic .

J'utilise ce cercle (qui est en fait un disque) pour replace le thumbImage d'un UISlider . L'anti-crénelage est appliqué par défaut.

Mais le résultat sur mon iPhone 6 n'est clairement pas bon. Je peux clairement voir les pixels, pas autant qu'avec l'antialiasing, mais beaucoup plus que les pixels d'un UISlider normal.

Peut-être que je fais quelque chose de mal. Donc ma question est, est-il un moyen d'get par programmation le même bon disque que celui utilisé par défaut pour un UISlider?

MODIFIER:

Voici comment je crée le disque:

 class func drawDisk(rgbValue:UInt32, rectForDisk: CGRect = CGRectMake(0.0, 0.0, 1.0, 1.0)) -> UIImage { let color = uicolorFromHex(rgbValue) UIGraphicsBeginImageContext(rectForDisk.size) let context = UIGraphicsGetCurrentContext() CGContextSetFillColorWithColor(context, color.CGColor) CGContextFillEllipseInRect(context, rectForDisk) let rectForCircle = CGRectMake(0.5, 0.5, rectForDisk.size.width - 1, rectForDisk.size.height - 1) CGContextSetLineWidth(context, 1.0) CGContextSetStrokeColorWithColor(context, UIColor.blackColor().CGColor) CGContextAddEllipseInRect(context, rectForCircle) CGContextStrokePath(context) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } 

Le problème est que vous créez un context graphique non rétine lors de l'utilisation de UIGraphicsBeginImageContext , comme mentionné dans la documentation:

Cette fonction équivaut à appeler la fonction UIGraphicsBeginImageContextWithOptions avec le paramètre opaque défini sur NO et un facteur d'échelle de 1.0 .

Au lieu de cela, vous devriez utiliser UIGraphicsBeginImageContextWithOptions pour créer votre context d'image. Vous pouvez continuer à passer NO pour le paramètre opaque si vous voulez une image qui supporte la transparence (identique à ce que vous faites implicitement maintenant).

Dans la plupart des cas, vous pouvez passer 0.0 pour le facteur d'échelle. Ceci définit le facteur d'échelle à celui de l'écran principal de l'appareil. Encore une fois, comme mentionné dans la documentation:

Si vous spécifiez une valeur de 0.0 , le facteur d'échelle est défini sur le facteur d'échelle de l'écran principal du périphérique.


Bref, vous devriez créer votre context d'image comme ceci:

 UIGraphicsBeginImageContextWithOptions(rectForDisk.size, false, 0.0) // false for Swift