SWIFT, при CornerRadius, Border не прилегает к границам закругления, как исправить?

Когда вы применяете CornerRadius к слою (layer) объекта UIView или CALayer, граница слоя не прилегает к закругленным углам. Это происходит потому, что CornerRadius применяется только к окружности, описываемой углами слоя, и граница рисуется по внешней границе окружности.

Есть несколько способов исправить эту проблему:

1. Можно добавить еще один слой поверх вашего слоя (layer), нанести на него закругленные углы с помощью CornerRadius и потребовать от границы быть соответствующей радиусу угла слоя. Например, вы можете использовать UIBezierPath для создания формы слоя с закругленными углами, и заполнить форму пустым цветом, чтобы получить только границу:

let layer = UIView()
    
let borderLayer = CAShapeLayer()
borderLayer.frame = layer.bounds
borderLayer.path = UIBezierPath(roundedRect: layer.bounds, cornerRadius: 10).cgPath
borderLayer.lineWidth = 2
borderLayer.strokeColor = UIColor.black.cgColor
borderLayer.fillColor = UIColor.clear.cgColor
    
layer.layer.addSublayer(borderLayer)

2. Если вы используете Auto Layout для настройки ваших представлений, вы также можете создать собственный настраиваемый класс вида, унаследованный от UIView, и переопределить метод layoutSubviews. В этом методе вы можете установить корректные значения для CornerRadius и рамки:

import UIKit

class RoundedView: UIView {
    override func layoutSubviews() {
        super.layoutSubviews()
        
        layer.cornerRadius = bounds.width / 2
        layer.masksToBounds = true

        let borderLayer = CAShapeLayer()
        borderLayer.frame = bounds
        borderLayer.path = UIBezierPath(ovalIn: bounds).cgPath
        borderLayer.lineWidth = 2
        borderLayer.strokeColor = UIColor.black.cgColor
        borderLayer.fillColor = UIColor.clear.cgColor
        
        layer.addSublayer(borderLayer)
    }
}

Затем вы можете использовать свой собственный класс вида в вашем коде:

let roundedView = RoundedView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
roundedView.backgroundColor = UIColor.red
parentView.addSubview(roundedView)

3. Если вам необходимо установить границу с закругленными углами, но без изменения радиуса угла слоя, вы можете использовать встроенные возможности CALayer для этого. Вы можете установить path для границы с закругленными углами, используя UIBezierPath. Это позволит вам управлять закругленными углами границы независимо от CornerRadius:

let layer = UIView()
    
let borderLayer = CAShapeLayer()
borderLayer.frame = layer.bounds
borderLayer.path = UIBezierPath(roundedRect: layer.bounds, cornerRadius: 10).cgPath
borderLayer.lineWidth = 2
borderLayer.strokeColor = UIColor.black.cgColor
borderLayer.fillColor = UIColor.clear.cgColor
    
layer.layer.addSublayer(borderLayer)

Надеюсь, эти решения помогут вам исправить проблему с границей, которая не прилегает к закругленным углам при использовании CornerRadius в iOS.