Изменить 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)
    }
}

}