it-swarm.com.ru

Изменить UIButton BorderColor в раскадровке

Я устанавливаю CornerRadius и BorderWidth для кнопки UI в пользовательских атрибутах времени выполнения. Без добавления layer.borderColor это работает хорошо и отображать границу в черном цвете. Но когда add layer.borderColor не работает (не показывает рамку).

enter image description here

67
Jaleel Nazir

Для Swift: 

 enter image description here

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
        }
    }
}
141
Jaleel Nazir

Я получил ответ на изменение layer.borderColor to 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

75
Jaleel Nazir

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

36
Cons Bulaquena

Объяснение, возможно, теряется в некоторых других ответах здесь:

Причина, по которой это свойство не устанавливается, заключается в том, что layer.borderColor нужно значение с типом CGColor.

Но только определяемые пользователем типы UIColor могут быть заданы через определяемые пользователем атрибуты среды выполнения Interface Builder!

Итак, вы должны установить UIColor для свойства прокси через Interface Builder, а затем перехватить этот вызов, чтобы установить эквивалентный CGColor для свойства layer.borderColor.

Это может быть достигнуто путем создания категории в CALayer, установки ключевого пути в уникальное новое «свойство» (borderColorFromUIColor) и в категории, переопределяющей соответствующий установщик (setBorderColorFromUIColor:).

7
pkamb

В случае Swift функция не работает. Вам потребуется вычисляемое свойство для достижения желаемого результата:

extension CALayer {
    var borderColorFromUIColor: UIColor {
        get {
            return UIColor(CGColor: self.borderColor!)
        } set {
            self.borderColor = newValue.CGColor
        }
    }
}
0
Furqan Khan

Есть намного лучший способ сделать это! Вы должны использовать @IBInspectable. Проверьте запись в блоге Майка Вельмера здесь: https://spin.atomicobject.com/2017/07/18/Swift-interface-builder/

Это фактически добавляет функцию к IB в xCode! На некоторых скриншотах в других ответах создается впечатление, что поля существуют в IB, но по крайней мере в xCode 9 их нет. Но вслед за его постом их добавлю.

0
cdeerinck