iOS UIButton с закругленными углами и фоновой ошибкой

Я нашел одну странную проблему с округлым UIButton.

Это мой блок кода для создания этой кнопки.

let roundedButton = UIButton(type: .System)
roundedButton.frame = CGRectMake(100, 100, 100, 100)
roundedButton.backgroundColor = UIColor.blackColor()
roundedButton.layer.borderColor = UIColor.whiteColor().CGColor
roundedButton.layer.borderWidth = 3.0
roundedButton.layer.cornerRadius = roundedButton.frame.size.width/2
roundedButton.layer.masksToBounds = true
self.view.addSubview(roundedButton)

Как вы можете видеть, есть кнопка UIB с backgroundColor, границей и угловым радиусом. Это полностью округлено. Но в результате я получаю следующий вид: округлая кнопка с рамкой 1px

Вы можете видеть, что граница 1px вне кнопки, это ее backroundColor (черный). Кажется, что его внутренняя граница (белая) не начинается с края кнопки.

У вас есть идеи, как это исправить?

3 ответа

Решение

Вместо этого используйте CAShapeLayer, он также обеспечивает повышенную производительность:

    let roundedButton = UIButton(type: .Custom)
    roundedButton.frame = CGRectMake(100, 100, 100, 100)
    let _border = CAShapeLayer()
    _border.path = UIBezierPath(roundedRect: roundedButton.bounds, cornerRadius:roundedButton.frame.size.width/2).CGPath
    _border.frame = roundedButton.bounds
    _border.strokeColor = UIColor.whiteColor().CGColor
    _border.fillColor = UIColor.blackColor().CGColor
    _border.lineWidth = 3.0
    roundedButton.layer.addSublayer(_border)

    self.view.addSubview(roundedButton)

Помните, что не следует использовать backgroundColor ofndedButton, просто используйте fillColor из CAShapeLayer.

Это также происходит при добавлении границ к изображениям. Я не мог найти способ решить это напрямую, но вместо этого я добавил белый UIView позади моего изображения, чтобы добиться того же внешнего вида.

В вашем случае добавьте белый UIView за кнопкой, с большими размерами ширины и высоты, чтобы получить желаемую ширину границы (в вашем случае она будет на 6 [3x2] больше, чем кнопка, и на 6 шире). Затем просто примените радиус границы как к UIView, так и к UIButton и вуаля!

Я думаю, что это ошибка с CALayer,

Я бы сделал что-то вроде этого:

let borderWidth: CGFloat = 3.0

let roundedButton = UIButton(type: .System)
roundedButton.frame = CGRectMake(100, 100, 100, 100)
roundedButton.layer.cornerRadius = roundedButton.frame.size.width / 2
roundedButton.layer.backgroundColor = UIColor.whiteColor().CGColor
roundedButton.layer.masksToBounds = true

let innerLayer = CALayer()
innerLayer.frame = CGRect(
  x: borderWidth,
  y: borderWidth,
  width: roundedButton.frame.width - borderWidth * 2,
  height: roundedButton.frame.height - borderWidth * 2
)
innerLayer.backgroundColor = UIColor.blackColor().CGColor
innerLayer.cornerRadius = innerLayer.frame.size.width / 2
roundedButton.layer.addSublayer(innerLayer)
Другие вопросы по тегам