UIButton - это UIView, так что вы можете добавить созданный вами слой к кнопке точно так же, как вы делали вид:
button.layer.addSublayer(shapeLayer)
Обратите внимание, что этот слой будет затем покрывать меткуUIButton, но простой способ решить эту проблему - изменить z-положение слоя:
shapeLayer.zPosition = -1
Например, если вы хотите добавить круглый слой к кнопке:
let circlePath = UIBezierPath(ovalIn: button.bounds)
let shapeLayer = CAShapeLayer()
shapeLayer.path = circlePath.cgPath
shapeLayer.zPosition = -1
button.layer.addSublayer(shapeLayer)
Или, сопоставляя круг в вашем примере, но создавая кнопку перед формой:
// define circle parameters
let radius: CGFloat = 150
let center = CGPoint(x: 200, y: 350)
// create the button
let button = UIButton(frame: CGRect(origin: center.applying(CGAffineTransform(translationX: -radius, y: -radius)),
size: CGSize(width: 2 * radius, height: 2 * radius)))
// create the circle layer
let circlePath = UIBezierPath(ovalIn: button.bounds)
let shapeLayer = CAShapeLayer()
shapeLayer.path = circlePath.cgPath
shapeLayer.zPosition = -1
// add the circle layer to the button
button.layer.addSublayer(shapeLayer)
view.addSubview(button)