我尝试使用长UIView制作一个标准的渐变上下。但是还不满。这笔尖的UITableViewCell的一部分,所以我没有获得viewDidLayoutSubviews()
在这个线程。
我试图contentView.layoutIfNeeded()
从此视图的代码版本中调用。我在调用UITableView cellForRowAtIndexPath
时调用了它。但这没有效果。
我准备中的渐变awakeFromNib()
。
let colors = [ UIColor(red: 33/255.0, green: 33/255.0, blue: 33/255.0, alpha: 1.0).cgColor, UIColor(red: 51/255.0, green: 51/255.0, blue: 51/255.0, alpha: 1.0).cgColor] let gradient = CAGradientLayer() gradient.frame = gradientView.bounds gradient.colors = colors gradientView.layer.insertSublayer(gradient, at: 0)
我的代码有问题吗?
您应该使用view的bounds
而不是frame
,因为您的图层在视图的内部,并且框架可能有偏移。
的视图布局在之后更改awakeFromNib
。因此,您应该调整layoutSubviews
视图中图层的大小。为此,创建一个属性gradient
并:
let gradient: CAGradientLayer = CAGradientLayer() override func awakeFromNib() { ... let colors = [ UIColor(red: 33/255.0, green: 33/255.0, blue: 33/255.0, alpha: 1.0).cgColor, UIColor(red: 51/255.0, green: 51/255.0, blue: 51/255.0, alpha: 1.0).cgColor] gradient.frame = bounds gradient.colors = colors gradientView.layer.insertSublayer(gradient, at: 0) ... } override func layoutSubviews() { super.layoutSubviews() gradient.frame = bounds }
编辑:替代方法是具有自己的图层类的自定义视图:
public class GradientLayer: UIView { @IBInspectable var startColor: UIColor! = UIColor(red: 33/255.0, green: 33/255.0, blue: 33/255.0, alpha: 1.0) @IBInspectable var endColor: UIColor! = UIColor(red: 51/255.0, green: 51/255.0, blue: 51/255.0, alpha: 1.0) override class var layerClass : AnyClass { return CAGradientLayer.self } override func awakeFromNib() { super.awakeFromNib() let colors = [ startColor.cgColor, endColor.cgColor ] if let gradient = self.layer as? CAGradientLayer { gradient.colors = colors } } }
这更加优雅,因为您可以用IB inspectables替换静态颜色,并且具有可重用的组件视图。