我正在尝试将渐变应用于UICollectionView的其中一个单元格中的UILabel。
在线以下响应之后,我将扩展名添加到了UIImage:
extension UIImage {
static func gradientImageWithBounds(bounds: CGRect, colors: [CGColor]) -> UIImage {
let gradientLayer = CAGradientLayer()
gradientLayer.frame = bounds
gradientLayer.colors = colors
gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
UIGraphicsBeginImageContext(gradientLayer.bounds.size)
if let context = UIGraphicsGetCurrentContext() {
gradientLayer.render(in: context )
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image!
}
return UIImage()
}
}
并且当我将其应用于普通标签时,它就像一个吊饰:
let gradientImage = UIImage.gradientImageWithBounds(bounds: someLabel.bounds, colors: [UIColor.black.cgColor, UIColor.white.cgColor])
someLabel.textColor = UIColor.init(patternImage: gradientImage)
问题是,我想将渐变应用于的标签是UICollectionViewCell的一部分,当我尝试这样做时:
override init(frame: CGRect) {
super.init(frame: frame)
addSubview(nameLabel)
nameLabel.snp.makeConstraints { (make) in
make.top.bottom.trailing.equalToSuperview()
make.leading.equalToSuperview().inset(10)
}
let gradientImage = UIImage.gradientImageWithBounds(bounds: nameLabel.bounds, colors: [UIColor.black.cgColor, UIColor.white.cgColor])
nameLabel.textColor = UIColor.init(patternImage: gradientImage)
}
不起作用。当我在创建gradientImage之前立即停止执行时,不幸的是nameLabel.bounds等于0:
(lldb) po nameLabel.bounds
▿ (0.0, 0.0, 0.0, 0.0)
▿ origin : (0.0, 0.0)
- x : 0.0
- y : 0.0
▿ size : (0.0, 0.0)
- width : 0.0
- height : 0.0
是否有办法在UICollectionViewCell定义中获取标签的边界?它是否取决于我如何定义UICollectionView?我想念什么?
或者,您知道在UICollectionViewCell中使用渐变的标签的任何其他方法吗?
我尝试在以下位置设置尺寸:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: 100, height: 60)
}
我尝试将布局的定义从自动更改为
layout.estimatedItemSize = CGSize(width: 100, height: 60)
似乎没有任何帮助。
我认为问题可能在于您正在异步地将视图布置在闭包内部。换句话说,在布置视图之前,下面的语句将被执行,这将解释为什么尚未设置界限。
override init(frame: CGRect) {
super.init(frame: frame)
addSubview(nameLabel)
nameLabel.snp.makeConstraints { (make) in
make.top.bottom.trailing.equalToSuperview()
make.leading.equalToSuperview().inset(10)
let gradientImage = UIImage.gradientImageWithBounds(bounds: nameLabel.bounds, colors: [UIColor.black.cgColor, UIColor.white.cgColor])
self.nameLabel.textColor = UIColor.init(patternImage: gradientImage)
}
}