Ios 100个UI按钮背景图像的最佳性能解决方案
我有一个UICollectionView,大约有100个单元格,每个单元格内都有一个圆形按钮。每行5个单元格,因此我必须上下滚动来选择按钮 选择按钮后,背景图像将发生变化。我已经用几种方法做了这件事,我将在下面介绍。也许这不是一个非常苛刻的观点,但我想知道在性能方面,什么是成本较低的方法 我找到的一个解决方案是使用Ios 100个UI按钮背景图像的最佳性能解决方案,ios,swift,performance,uibutton,Ios,Swift,Performance,Uibutton,我有一个UICollectionView,大约有100个单元格,每个单元格内都有一个圆形按钮。每行5个单元格,因此我必须上下滚动来选择按钮 选择按钮后,背景图像将发生变化。我已经用几种方法做了这件事,我将在下面介绍。也许这不是一个非常苛刻的观点,但我想知道在性能方面,什么是成本较低的方法 我找到的一个解决方案是使用UIImage的扩展,并将按钮.layer.cornerRadius设置如下: extension UIImage { class func imageWithColor(colo
UIImage
的扩展,并将按钮.layer.cornerRadius
设置如下:
extension UIImage {
class func imageWithColor(color: UIColor?) -> UIImage! {
let rect = CGRectMake(0.0, 0.0, 1.0, 1.0)
UIGraphicsBeginImageContextWithOptions(rect.size, false, 0)
let context = UIGraphicsGetCurrentContext();
if let color = color {
color.setFill()
}
else {
UIColor.whiteColor().setFill()
}
CGContextFillRect(context, rect);
let image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image
}
然后,将按钮图像背景设置为:
button.layer.cornerRadius = (cell.bounds.width - 8) / 2
button.clipsToBounds = true
button.setBackgroundImage(UIImage.imageWithColor(UIColor.greenColor()), forState: UIControlState.Selected)
我听说设置层.cornerRadius
非常昂贵
另一种方法是在PS图象处理软件或类似的情况下设计一个正方形图像,中间有一个圆圈,让其余部分透明并将其设置为按钮背景。
或者另一个我还没有尝试过的选项,我认为它可能是制作一个1 x 1像素的彩色图像,并将背景填充设置为平铺(我仍然检查了这一个的代码)。但我认为这与第一种方式非常相似您会用任何软件来衡量性能,还是更深入地了解Swift语言来解决这个问题?尝试将掩码应用于图像。它更好,因为你为每一张图片做一次。这不应影响滚动性能。你唯一需要的是遮罩图像。它应该是白色背景的正方形图像,中间是黑色圆圈。您可以找到示例(obj-c)。斯威夫特: UPD:如果图像不是单色的,上面的代码很有用。如果它们是单色的,您可以将
ui按钮
与系统类型一起使用,而不是imageview
。只需禁用userInteraction
,为此按钮设置圆圈图像,并操作tintColor
extension UIImage {
func maskedImage(mask: UIImage) -> UIImage {
let maskImgRef = mask.CGImage
let maskRef = CGImageMaskCreate(CGImageGetWidth(maskImgRef), CGImageGetHeight(maskImgRef), CGImageGetBitsPerComponent(maskImgRef), CGImageGetBitsPerPixel(maskImgRef), CGImageGetBytesPerRow(maskImgRef), CGImageGetDataProvider(maskImgRef), nil, false)
if let maskedRef = CGImageCreateWithMask(self.CGImage, maskRef) {
let maskedIm = UIImage(CGImage: maskedRef)
UIGraphicsBeginImageContext(maskedIm.size)
maskedIm.drawInRect(CGRect(origin: CGPointZero, size: maskedIm.size))
let img = UIGraphicsGetImageFromCurrentImageContext()
return img
}
return self
}
}