为视网膜显示创建具有抗锯齿功能的圆圈或圆盘
Create a circle or a disk with antialiasing for retina display
我使用 CoreGraphic
中的 CGContextFillEllipseInRect
创建了一个圆圈。
我正在使用这个圆圈(实际上是一个圆盘)来替换 UISlider
的 thumbImage
。默认应用抗锯齿。
但我的 iPhone 6 的结果显然不好。我可以清楚地看到像素,虽然没有关闭抗锯齿功能那么多,但比普通 UISlider 的像素要多得多。
也许我做错了什么。所以我的问题是,有没有办法以编程方式获得与 UISlider 默认使用的磁盘相同的好磁盘?
编辑:
下面是我创建磁盘的方法:
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
}
问题是您在使用 UIGraphicsBeginImageContext
时创建了非视网膜图形上下文,如文档中所述:
This function is equivalent to calling the UIGraphicsBeginImageContextWithOptions
function with the opaque parameter set to NO
and a scale factor of 1.0
.
相反,您应该使用 UIGraphicsBeginImageContextWithOptions
来创建图像上下文。如果你想要一个支持透明度的图像(与你现在隐式做的一样),你可以继续为不透明参数传递 NO
。
在大多数情况下,您可以通过 0.0
作为比例因子。这会将比例因子设置为设备主屏幕的比例因子。同样,如文档中所述:
If you specify a value of 0.0
, the scale factor is set to the scale factor of the device’s main screen.
所以,简而言之,您应该像这样创建图像上下文:
UIGraphicsBeginImageContextWithOptions(rectForDisk.size, false, 0.0) // false for Swift
我使用 CoreGraphic
中的 CGContextFillEllipseInRect
创建了一个圆圈。
我正在使用这个圆圈(实际上是一个圆盘)来替换 UISlider
的 thumbImage
。默认应用抗锯齿。
但我的 iPhone 6 的结果显然不好。我可以清楚地看到像素,虽然没有关闭抗锯齿功能那么多,但比普通 UISlider 的像素要多得多。
也许我做错了什么。所以我的问题是,有没有办法以编程方式获得与 UISlider 默认使用的磁盘相同的好磁盘?
编辑:
下面是我创建磁盘的方法:
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
}
问题是您在使用 UIGraphicsBeginImageContext
时创建了非视网膜图形上下文,如文档中所述:
This function is equivalent to calling the
UIGraphicsBeginImageContextWithOptions
function with the opaque parameter set toNO
and a scale factor of1.0
.
相反,您应该使用 UIGraphicsBeginImageContextWithOptions
来创建图像上下文。如果你想要一个支持透明度的图像(与你现在隐式做的一样),你可以继续为不透明参数传递 NO
。
在大多数情况下,您可以通过 0.0
作为比例因子。这会将比例因子设置为设备主屏幕的比例因子。同样,如文档中所述:
If you specify a value of
0.0
, the scale factor is set to the scale factor of the device’s main screen.
所以,简而言之,您应该像这样创建图像上下文:
UIGraphicsBeginImageContextWithOptions(rectForDisk.size, false, 0.0) // false for Swift