Ios 100个UI按钮背景图像的最佳性能解决方案

Ios 100个UI按钮背景图像的最佳性能解决方案,ios,swift,performance,uibutton,Ios,Swift,Performance,Uibutton,我有一个UICollectionView,大约有100个单元格,每个单元格内都有一个圆形按钮。每行5个单元格,因此我必须上下滚动来选择按钮 选择按钮后,背景图像将发生变化。我已经用几种方法做了这件事,我将在下面介绍。也许这不是一个非常苛刻的观点,但我想知道在性能方面,什么是成本较低的方法 我找到的一个解决方案是使用UIImage的扩展,并将按钮.layer.cornerRadius设置如下: extension UIImage { class func imageWithColor(colo

我有一个UICollectionView,大约有100个单元格,每个单元格内都有一个圆形按钮。每行5个单元格,因此我必须上下滚动来选择按钮

选择按钮后,背景图像将发生变化。我已经用几种方法做了这件事,我将在下面介绍。也许这不是一个非常苛刻的观点,但我想知道在性能方面,什么是成本较低的方法

我找到的一个解决方案是使用
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
    }
}