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



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

当按钮被选中时,背景图像发生变化。我已经用几种方法做到了这一点,我将在下面介绍。也许这不是一个非常苛刻的观点,但我想知道在性能方面更便宜的方法是什么。

我发现的一个解决方案是使用UIImage的扩展并像这样设置button.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)

我听说设置layer.cornerRadius非常昂贵。

另一种方法是在Photoshop或类似软件中设计一个方形图像,中间有一个圆圈,其余部分透明,并将其设置为按钮背景。

或者另一个选项,我还没有尝试过,我认为它可能是制作一个1 x 1像素的图像,并设置背景填充为平铺(我仍然检查了这个代码)。但我认为这与第一种方式非常相似。

你会用任何软件来衡量性能还是仅仅更深入地了解Swift语言来解决这个问题?

尝试对图像应用蒙版。它更好,因为你为每个图像做了一次。这应该不会影响滚动性能。你所需要的只是蒙版图像。它应该是方形图像,白色背景和黑色圆圈在中间。在这里您可以找到示例(obj-c)。斯威夫特:

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
    }
}

UPD:如果你的图像不是单色的,上面的代码是有用的。如果它们是单色的,您可以使用UIButtons与系统类型而不是ImageViews。只需禁用userInteraction,设置这个按钮的圆圈图像,并操作tintColor

最新更新