Изменить UIButton BorderColor в раскадровке
Я устанавливаю CornerRadius и BorderWidth для UIbutton в пользовательских атрибутах времени выполнения. Без добавления layer.borderColor он работает хорошо и отображает границу черного цвета. Но при добавлении layer.borderColor не работает (не отображается граница).
![enter image description here]()
Ответы
Ответ 1
Для Swift:
![введите описание изображения здесь]()
Swift 3:
extension UIView {
@IBInspectable var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
set {
layer.cornerRadius = newValue
layer.masksToBounds = newValue > 0
}
}
@IBInspectable var borderWidth: CGFloat {
get {
return layer.borderWidth
}
set {
layer.borderWidth = newValue
}
}
@IBInspectable var borderColor: UIColor? {
get {
return UIColor(cgColor: layer.borderColor!)
}
set {
layer.borderColor = newValue?.cgColor
}
}
}
Swift 2.2:
extension UIView {
@IBInspectable var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
set {
layer.cornerRadius = newValue
layer.masksToBounds = newValue > 0
}
}
@IBInspectable var borderWidth: CGFloat {
get {
return layer.borderWidth
}
set {
layer.borderWidth = newValue
}
}
@IBInspectable var borderColor: UIColor? {
get {
return UIColor(cgColor: layer.borderColor!)
}
set {
layer.borderColor = newValue?.cgColor
}
}
}
Ответ 2
Я получил ответ Изменить layer.borderColor на
layer.borderColorFromUIColor
![enter image description here]()
и добавьте код в .m файл
#import <QuartzCore/QuartzCore.h>
@implementation CALayer (Additions)
- (void)setBorderColorFromUIColor:(UIColor *)color
{
self.borderColor = color.CGColor;
}
@end
Тик свойства в инспекторе атрибутов
![Attribute Inspector]()
Ответ 3
Swift 4, Xcode 9.2 - Используйте IBDesignable
и IBInspectable
для создания пользовательских элементов управления и предварительного просмотра дизайна в Интерфейсном Разработчике.
Вот пример кода в Swift, поместите чуть ниже UIKit
в ViewController.swift:
@IBDesignable extension UIButton {
@IBInspectable var borderWidth: CGFloat {
set {
layer.borderWidth = newValue
}
get {
return layer.borderWidth
}
}
@IBInspectable var cornerRadius: CGFloat {
set {
layer.cornerRadius = newValue
}
get {
return layer.cornerRadius
}
}
@IBInspectable var borderColor: UIColor? {
set {
guard let uiColor = newValue else { return }
layer.borderColor = uiColor.cgColor
}
get {
guard let color = layer.borderColor else { return nil }
return UIColor(cgColor: color)
}
}
}
Если вы перейдете к Атрибутам, которые можно просмотреть в представлении, вы должны найти эти свойства визуально, отредактируйте свойства:
![enter image description here]()
Изменения также отражаются в пользовательских атрибутах времени выполнения:
![enter image description here]()
Беги во время сборки и вуаля! Вы увидите свою четкую закругленную кнопку с рамкой.
![enter image description here]()
Ответ 4
Объяснение, возможно, потеряно в некоторых других ответах здесь:
Причина, по которой это свойство не устанавливается, заключается в том, что layer.borderColor
требуется значение с типом CGColor
.
Но только теги UIColor
могут быть заданы с помощью пользовательских атрибутов времени выполнения интерфейса Builder!
Итак, вы должны установить UIColor для свойства прокси через Interface Builder, а затем перехватить этот вызов, чтобы установить эквивалентный CGColor в свойство layer.borderColor
.
Это можно сделать, создав категорию на CALayer, установив путь ключа к уникальному новому "свойству" (borderColorFromUIColor
) и в категории, переопределяющей соответствующий сеттер (setBorderColorFromUIColor:
).
Ответ 5
Есть намного лучший способ сделать это! Вы должны использовать @IBInspectable. Проверьте запись в блоге Майка Вулмера здесь: https://spin.atomicobject.com/2017/07/18/swift-interface-builder/
Это фактически добавляет функцию IB в XCode! На некоторых скриншотах в других ответах создается впечатление, что поля существуют в IB, но, по крайней мере, в Xcode 9 их нет. Но вслед за его постом добавлю их.
Ответ 6
В случае Swift функция не работает. Для достижения желаемого результата вам понадобится вычисленное свойство:
extension CALayer {
var borderColorFromUIColor: UIColor {
get {
return UIColor(CGColor: self.borderColor!)
} set {
self.borderColor = newValue.CGColor
}
}
}
Ответ 7
Это работает для меня.
Swift 3, Xcode 8.3
![Identity inspector (UIButton in this case]()
Расширение CALayer:
extension CALayer {
var borderWidthIB: NSNumber {
get {
return NSNumber(value: Float(borderWidth))
}
set {
borderWidth = CGFloat(newValue.floatValue)
}
}
var borderColorIB: UIColor? {
get {
return borderColor != nil ? UIColor(cgColor: borderColor!) : nil
}
set {
borderColor = newValue?.cgColor
}
}
var cornerRadiusIB: NSNumber {
get {
return NSNumber(value: Float(cornerRadius))
}
set {
cornerRadius = CGFloat(newValue.floatValue)
}
}
}