Я устанавливаю CornerRadius и BorderWidth для UIbutton в определяемых пользователем атрибутах времени выполнения. Без добавления layer.borderColor он работает хорошо и отображает границу черным цветом. Но при добавлении layer.borderColor не работает (не показывает границу).
ios
colors
uibutton
storyboard
Мохамед Джалил Назир
источник
источник
Получил ответ. Измените borderColor вместо layer.borderColor :
и добавьте этот код в файл .m:
#import <QuartzCore/QuartzCore.h> @implementation CALayer (Additions) - (void)setBorderColorFromUIColor:(UIColor *)color { self.borderColor = color.CGColor; } @end
Свойства галочки в Attribute Inspector
источник
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) } } }
Если вы перейдете к проверяемым атрибутам представления, вы должны найти эти свойства визуально, отредактируйте свойства:
Изменения также отражаются в пользовательских атрибутах времени выполнения:
Запустите время сборки и вуаля! вы увидите четкую круглую кнопку с рамкой.
источник
Объяснение, возможно, потеряно в некоторых других ответах здесь:
Причина, по которой это свойство не устанавливается, заключается в том, что
layer.borderColor
требуется значение с типомCGColor
.Но только
UIColor
типы могут быть установлены через определяемые пользователем атрибуты времени выполнения Interface Builder!Таким образом, вы должны установить UIColor для свойства прокси через Interface Builder, а затем перехватить этот вызов, чтобы установить эквивалентный CGColor для
layer.borderColor
свойства.Это может быть выполнено путем создания Категории на CALayer, установки ключевого пути на уникальное новое «свойство» (
borderColorFromUIColor
) и в категории, переопределив соответствующий метод установки (setBorderColorFromUIColor:
).источник
Есть способ сделать это лучше! Вам следует использовать @IBInspectable. Посмотрите запись в блоге Майка Вулмера здесь: https://spin.atomicobject.com/2017/07/18/swift-interface-builder/
Фактически он добавляет эту функцию в IB в Xcode! Некоторые скриншоты в других ответах создают впечатление, что поля существуют в IB, но, по крайней мере, в Xcode 9 их нет. Но после его поста их добавлю.
источник
В случае Swift функция не работает. Для достижения желаемого результата вам понадобится вычисляемое свойство:
extension CALayer { var borderColorFromUIColor: UIColor { get { return UIColor(CGColor: self.borderColor!) } set { self.borderColor = newValue.CGColor } } }
источник
У меня это работает.
Swift 3, Xcode 8.3
Расширение 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) } }
}
источник