Змініть UIButton BorderColor у розкадруванні


80

Я встановлюю CornerRadius і BorderWidth для кнопки UI в визначених користувачем атрибутах часу виконання. Без додавання layer.borderColor це працює добре і відображає межу чорним кольором. Але при додаванні layer.borderColor не працює (не відображає межу).

введіть тут опис зображення

Відповіді:


159

Для Свіфта:

введіть тут опис зображення

Свіфт 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
        }
    }
}

Свіфт 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
        }
    }
}

привіт, я створюю клас CustomeView в цілі c, але він не відображається на моїй розкадровці Plz, допоможіть мені.
Pooja Srivastava

Дякую тонна за це! :)
Vijay VS

Дякую, Чудово, Ідеально
Abo3atef

1
Акуратно, однак XCode (версія 8.3.3 (8E3004b)) не відображає результат у попередньому перегляді, чи правильно це і не можна змінити (крім створення власного подання)?
Костянтин Берков

Це найелегантніше рішення! Хороша робота!
Золтан Вінклер

88

Я отримав відповідь. Змінити borderColor замість layer.borderColor :

Фрагмент Xcode

і додайте цей код у файл .m:

#import <QuartzCore/QuartzCore.h>
@implementation CALayer (Additions)

- (void)setBorderColorFromUIColor:(UIColor *)color
{
    self.borderColor = color.CGColor;
}

@end

Позначте властивості в Інспекторі атрибутів

Інспектор атрибутів


5
@jithin Я написав це як розширення Swift, ось код: розширення CALayer {func setBorderColorFromUIColor (color: UIColor) {self.borderColor = color.CGColor}}
Гай,

1
трюк спрацював. частково. як, чорт, я отримую чорний колір облямівки, хоча я вказав червоний колір? !!!!!! будь-які ідеї? хто-небудь?
static0886

@ static0886: Це було через те, який колір, який ви застосовуєте, не встановлений на межі. За моїм розумінням, ми не можемо встановити колір рамки з розкадрування, оскільки ця властивість не відображатиметься в UIComponent під час виконання. За замовчуванням це чорний колір. Якщо ви хочете провести пробну версію, видаливши властивість color із атрибутів.
Javeed

Для швидкого ви можете встановити його як: self.button.layer.borderColor = <UIColor.CGColor>
Сем

Цей шар.borderColorFromUIColor працював для мене на дошці сюжетів. Дякую.
Рамакрішна

50

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)
        }
    }
}

Якщо ви перейдете до перевірених атрибутів подання, вам слід знайти ці властивості візуально, відредагувати властивості:

введіть тут опис зображення

Зміни також відображаються у визначених користувачем атрибутах виконання:

введіть тут опис зображення

Бігайте за час побудови і Вуаля! ви побачите свою чітку округлу кнопку з облямівкою.

введіть тут опис зображення


Це допомогло мені досягти цього в раскадровці. Ваша відповідь дуже зрозуміла для реалізації.
Р. Мохан

Це найбільш точна відповідь на це питання на чітко поясненому прикладі.
SeaWarrior404

Якщо ви можете додати для Objective-C, це буде оцінено.
Міхір Оза,

9

Пояснення, можливо, загублене в деяких інших відповідях тут:

Причиною того, що ця властивість не встановлюється, є layer.borderColorнеобхідність значення з типомCGColor .

Але лише UIColor типи можна встановити за допомогою визначених користувачем атрибутів середовища виконання!

Отже, ви повинні встановити UIColor для властивості проксі через Interface Builder, а потім перехопити цей виклик, щоб встановити еквівалент CGColor у layer.borderColor властивості.

Цього можна досягти, створивши категорію на CALayer, встановивши для Ключового шляху унікальну нову "властивість" ( borderColorFromUIColor), і в категорії замінивши відповідний сетер ( setBorderColorFromUIColor:).


1

Для цього є набагато кращий спосіб! Ви повинні використовувати @IBInspectable. Перегляньте запис у блозі Майка Вулмера тут: https://spin.atomicobject.com/2017/07/18/swift-interface-builder/

Це насправді додає цю функцію до IB у Xcode! Деякі знімки екрана в інших відповідях видають, ніби поля існують у IB, але принаймні в Xcode 9 вони цього не роблять. Але наступний його пост додасть їх.


Я спробував такий підхід, і це зробило Xcode справді повільним. Це теж відбувається з усіма вами?
Міп

0

У випадку Swift функція не працює. Для досягнення бажаного результату вам знадобиться обчислювана властивість:

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

0

Це працює для мене.

Свіфт 3, Xcode 8.3

Інспектор особи (у цьому випадку кнопка UIB

Розширення 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)
    }
}

}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.