Следующее работает со Swift 4.2 для применения границы вдоль существующего UIView.
extension UIView {
enum Side {
case top
case bottom
case left
case right
}
func addBorder(to side: Side, color: UIColor, borderWidth: CGFloat) {
let subLayer = CALayer()
subLayer.borderColor = color.cgColor
subLayer.borderWidth = borderWidth
let origin = findOrigin(side: side, borderWidth: borderWidth)
let size = findSize(side: side, borderWidth: borderWidth)
subLayer.frame = CGRect(origin: origin, size: size)
layer.addSublayer(subLayer)
}
private func findOrigin(side: Side, borderWidth: CGFloat) -> CGPoint {
switch side {
case .right:
return CGPoint(x: frame.maxX - borderWidth, y: 0)
case .bottom:
return CGPoint(x: 0, y: frame.maxY - borderWidth)
default:
return .zero
}
}
private func findSize(side: Side, borderWidth: CGFloat) -> CGSize {
switch side {
case .left, .right:
return CGSize(width: borderWidth, height: frame.size.height)
case .top, .bottom:
return CGSize(width: frame.size.width, height: borderWidth)
}
}
}
И вы можете назвать это так:
myView.addBorder(to: .left, color: .black, borderWidth: 2.0)
Что происходитon:
- Пользователь предоставляет
Side
, как определено в перечислении, наряду с color
и borderWidth
- Создается и передается новый подслойa
borderColor
и borderWidth
- Исходное значение рассчитывается по определению стороны
- Размер рассчитывается также по определению стороны
- Наконец,слой получает кадр, а затем добавляется в качестве подслоя