100 UIButtons背景图像的最佳性能解决方案

时间:2015-10-02 15:22:50

标签: ios swift performance uibutton

我有一个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语言?

1 个答案:

答案 0 :(得分:0)

尝试将遮罩应用于图像。它更好,因为你为每张图片做了一次。这不应该影响滚动性能。只有你需要的是掩模图像。它应该是方形图像,白色背景和中间的黑色圆圈。 Here你可以找到例子(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