UIView 的 cornerRadius 与 CAShapeLayer 不同
UIView has different cornerRadius than CAShapeLayer
我想给 UITableViewCell
添加一个背景视图,还有一个 CAShapeLayer
作为背景视图周围的边框(我需要一个虚线边框)。
然而,我的问题是,即使我将视图和图层的 cornerRadius 设置为相同的值,它们的渲染方式也完全不同。
有人知道发生了什么事吗?
代码:
final class Cell: UITableViewCell {
private let borderLayer = CAShapeLayer()
private let _backgroundView = UIView()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
// Add a blue background view.
contentView.insertSubview(_backgroundView, at: 0)
_backgroundView.backgroundColor = .blue
_backgroundView.layer.cornerRadius = 28
// Add the border layer.
borderLayer.fillColor = nil
borderLayer.strokeColor = UIColor.red.cgColor
borderLayer.lineWidth = 2
contentView.layer.addSublayer(borderLayer)
}
override func layoutSubviews() {
super.layoutSubviews()
// Update the frames.
_backgroundView.frame = contentView.bounds
borderLayer.path = UIBezierPath(roundedRect: contentView.bounds, cornerRadius: _backgroundView.layer.cornerRadius).cgPath
}
}
A Playground Gist to reproduce it
感谢任何帮助!
拐角半径的计算好像和UIBezierPath(roundedRect:, cornerRadius:)不一致。
另一种方法怎么样?
喜欢:
_backgroundView.layer.borderWidth = 2
_backgroundView.layer.borderColor = UIColor.red.cgColor
直接从 CGPath 构建路径似乎可以解决问题。
borderLayer.path = CGPath(roundedRect: contentView.bounds, cornerWidth: _backgroundView.layer.cornerRadius,
cornerHeight: _backgroundView.layer.cornerRadius, transform: nil)
我想给 UITableViewCell
添加一个背景视图,还有一个 CAShapeLayer
作为背景视图周围的边框(我需要一个虚线边框)。
然而,我的问题是,即使我将视图和图层的 cornerRadius 设置为相同的值,它们的渲染方式也完全不同。
有人知道发生了什么事吗?
代码:
final class Cell: UITableViewCell {
private let borderLayer = CAShapeLayer()
private let _backgroundView = UIView()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
// Add a blue background view.
contentView.insertSubview(_backgroundView, at: 0)
_backgroundView.backgroundColor = .blue
_backgroundView.layer.cornerRadius = 28
// Add the border layer.
borderLayer.fillColor = nil
borderLayer.strokeColor = UIColor.red.cgColor
borderLayer.lineWidth = 2
contentView.layer.addSublayer(borderLayer)
}
override func layoutSubviews() {
super.layoutSubviews()
// Update the frames.
_backgroundView.frame = contentView.bounds
borderLayer.path = UIBezierPath(roundedRect: contentView.bounds, cornerRadius: _backgroundView.layer.cornerRadius).cgPath
}
}
A Playground Gist to reproduce it
感谢任何帮助!
拐角半径的计算好像和UIBezierPath(roundedRect:, cornerRadius:)不一致。
另一种方法怎么样?
喜欢:
_backgroundView.layer.borderWidth = 2
_backgroundView.layer.borderColor = UIColor.red.cgColor
直接从 CGPath 构建路径似乎可以解决问题。
borderLayer.path = CGPath(roundedRect: contentView.bounds, cornerWidth: _backgroundView.layer.cornerRadius,
cornerHeight: _backgroundView.layer.cornerRadius, transform: nil)