为什么 UITableViewCell 中的渐变层没有覆盖整个框架?
Why gradient layer in UITableViewCell not cover entire frame?
我尝试用长 UIView 制作标准的渐变上下。但它还没有满。 nib 是 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)
我的代码有问题吗?
您应该使用视图的 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
}
编辑:另一种方法是使用自己的图层 class:
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 替换静态颜色,并且您有一个可重用的组件视图。
override func layoutSubviews() {
super.layoutSubviews()
if let gradient = baseView.layer.sublayers?[0] as? CAGradientLayer {
gradient.frame = self.bounds
}
}
我尝试用长 UIView 制作标准的渐变上下。但它还没有满。 nib 是 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)
我的代码有问题吗?
您应该使用视图的 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
}
编辑:另一种方法是使用自己的图层 class:
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 替换静态颜色,并且您有一个可重用的组件视图。
override func layoutSubviews() {
super.layoutSubviews()
if let gradient = baseView.layer.sublayers?[0] as? CAGradientLayer {
gradient.frame = self.bounds
}
}