UIView имеет другой уголRadius, чем CAShapeLayer - PullRequest
1 голос
/ 10 февраля 2020

Я хочу добавить фоновое представление к UITableViewCell, а также CAShapeLayer, чтобы действовать в качестве границы вокруг фонового представления (мне понадобится пунктирная граница).

Однако моя проблема , хотя я установил для угла и угла вид и слой одинаковые значения, они отображаются совершенно по-разному.

enter image description here

Кто-нибудь знает, что происходит?

Код:

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
    }
}

Игровая площадка для воспроизведения

Любая помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Построение пути непосредственно из CGPath, похоже, решает проблему.

borderLayer.path = CGPath(roundedRect: contentView.bounds, cornerWidth: _backgroundView.layer.cornerRadius,
                          cornerHeight: _backgroundView.layer.cornerRadius, transform:  nil)
0 голосов
/ 10 февраля 2020

Похоже, что вычисление радиуса угла не соответствует UIBezierPath (roundedRect :, cornerRadius:).

Как насчет альтернативного подхода ??

Как:

_backgroundView.layer.borderWidth = 2
_backgroundView.layer.borderColor = UIColor.red.cgColor
...