Я устанавливаю CornerRadius и BorderWidth для UIbutton в пользовательских атрибутах времени выполнения. Без добавления layer.borderColor работает Хорошо и отображается граница черного цвета. Но когда добавьте layer.borderColor не работает (не показывает границу).Изменение UIButton BorderColor в раскадровке
ответ
Для 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
}
}
}
Я получил ответ Изменить layer.borderColor к layer.borderColorFromUIColor
и добавить код в файл .m
#import <QuartzCore/QuartzCore.h>
@implementation CALayer (Additions)
- (void)setBorderColorFromUIColor:(UIColor *)color
{
self.borderColor = color.CGColor;
}
@end
Tick свойства в атрибуте Инспектор
В случае Swift, функция не работает. Вам нужно вычисляемый свойство для достижения желаемого результата:
extension CALayer {
var borderColorFromUIColor: UIColor {
get {
return UIColor(CGColor: self.borderColor!)
} set {
self.borderColor = newValue.CGColor
}
}
}
Объяснение, возможно, теряется в некоторых других ответов здесь:
Причина, по которой это свойство не установлено, что layer.borderColor
необходимо значение с типом CGColor
.
Но только типы UIColor
могут быть установлены с помощью пользовательских атрибутов Runtime Interface Builder!
Итак, вы должны установить UIColor для свойства прокси через Interface Builder, а затем перехватить этот вызов, чтобы установить эквивалентный CGColor в свойство layer.borderColor
.
Это можно сделать, создав категорию на CALayer, установив путь ключа к уникальному новому «свойству» (borderColorFromUIColor
) и в категории, переопределяющей соответствующий сеттер (setBorderColorFromUIColor:
).
Это работает для меня. 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)
}
}
}
Swift 4, Xcode 9.2 - Использование IBDesignable
и IBInspectable
для создания пользовательских элементов управления и быстрый предварительный просмотр дизайна в Interface Builder.
Вот пример код в 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)
}
}
}
Если вы идете к атрибутам осматриваемым из точки зрения, вы должны найти эти свойства визуально, редактировать свойства :
изменения также отражены в User Defined Время воспроизведения Атрибуты:
Запуск во время сборки и Voila! вы увидите четкую закругленную кнопку с рамкой. ?
это правильный ответ thanx –
wow это лучший ответ. –
привет, я создаю класс CustomeView в объективе c, но его не покажут в моем раскадровке Plz, помогите мне. –