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