将渐变应用于UICollectionViewCell中的标签

问题描述 投票:0回答:1

我正在尝试将渐变应用于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)

似乎没有任何帮助。

swift uicollectionview uicollectionviewcell uicollectionviewlayout snapkit
1个回答
0
投票

我认为问题可能在于您正在异步地将视图布置在闭包内部。换句话说,在布置视图之前,下面的语句将被执行,这将解释为什么尚未设置界限。

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)

        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.