我有一个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
。