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

7 ответов:
Для 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 } } }
Я получил ответ изменить слой.необходимо to слой.borderColorFromUIColor
и добавьте код .файл м
#import <QuartzCore/QuartzCore.h> @implementation CALayer (Additions) - (void)setBorderColorFromUIColor:(UIColor *)color { self.borderColor = color.CGColor; } @endТИК свойства в Инспекторе атрибутов
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) } } }если вы перейдете к атрибутам, проверяемым в представлении, вы должны найти эти свойства визуально, отредактируйте свойства:
изменения также отражаются на пользователе Определенные Атрибуты Времени Выполнения:
выполнить во время сборки и вуаля! вы увидите свою четкую округлую кнопку с границей.
объяснение, возможно, теряется в некоторых других ответах здесь:
причина, по которой это свойство не устанавливается, заключается в том, что
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
расширение 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