Необходимо изменить UIButton в раскадровке



Я установил CornerRadius и BorderWidth для UIbutton в пользовательских атрибутах времени выполнения. Без добавления слой.необходимо Он хорошо работает и отображает границу в черном цвете. Но когда добавить слой.необходимо не работает(не показывает границы).



enter image description here

819   7  

7 ответов:

Для 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
        }
    }
}

Я получил ответ изменить слой.необходимо to слой.borderColorFromUIColor

enter image description here

и добавьте код .файл м

#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 для создания пользовательских элементов управления и живого просмотра проекта в Interface Builder.

вот пример кода в Swift, место чуть ниже UIKit в ViewController.Свифт:

@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

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

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

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

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

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

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

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

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

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

это работает для меня. 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)
    }
}

}

Comments

    Ничего не найдено.