Ios 更改情节提要中的UIButton边框颜色

Ios 更改情节提要中的UIButton边框颜色,ios,colors,uibutton,storyboard,Ios,Colors,Uibutton,Storyboard,我在用户定义的运行时属性中设置UIbutton的CornerRadius和BorderWidth。无需添加层。borderColor即可正常工作,并以黑色显示边框。但是当添加图层时,borderColor不起作用(不显示边框) 我得到了答案。更改borderColor而不是图层。borderColor: 并将此代码添加到.m文件中: #import <QuartzCore/QuartzCore.h> @implementation CALayer (Additions) - (v

我在用户定义的运行时属性中设置UIbutton的CornerRadius和BorderWidth。无需添加层。borderColor即可正常工作,并以黑色显示边框。但是当添加图层时,borderColor不起作用(不显示边框)


我得到了答案。更改borderColor而不是图层。borderColor

并将此代码添加到.m文件中:

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

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

@end
#导入
@实施(增补)
-(void)setBorderColorFromUIColor:(UIColor*)颜色
{
self.borderColor=color.CGColor;
}
@结束
勾选属性检查器中的属性


如果使用Swift,则该功能不起作用。您将需要一个计算属性来实现所需的结果:

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

对于Swift:

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

这个解释可能在这里的一些其他答案中丢失了:

未设置此属性的原因是
layer.borderColor
需要类型为
CGColor
的值

但是只有
UIColor
类型可以通过Interface Builder的用户定义的运行时属性进行设置

因此,必须通过Interface Builder将UIColor设置为代理属性,然后拦截该调用以将等效的CGColor设置为
layer.borderColor
属性

这可以通过在CALayer上创建一个类别,将密钥路径设置为一个唯一的新“属性”(
borderColorFromUIColor
),并在类别中覆盖相应的setter(
setboordcolorfromuicolor:
)来实现

Swift 3,Xcode 8.3

加莱尔分机:

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

}Swift 4,Xcode 9.2-使用
IBDesignable
IBInspectable
构建自定义控件并在Interface Builder中实时预览设计

以下是Swift中的示例代码,位于ViewController.Swift中
UIKit
的正下方:

@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)
        }
    }
}
如果转到视图的可检查属性,则应直观地找到这些属性,编辑属性:

这些更改也反映在用户定义的运行时属性中:

在构建时运行,瞧!您将看到带有边框的清晰圆形按钮


有一种更好的方法可以做到这一点!您应该使用@IBInspectable。请在此处查看Mike Woelmer的博客:


它实际上在Xcode中为IB添加了这个特性!其他答案中的一些屏幕截图显示,这些字段似乎存在于IB中,但至少在Xcode 9中不存在。但是在他的帖子后面会添加它们。

您已经将半径和宽度的数据值设置为字符串,但应该正确地设置为数字,而不是字符串


当你让它工作时,在看故事板时,这将不可见,但当应用程序运行时,除非你已经采取步骤使它@ibdesignable。

@jithin我写它作为一个快速扩展,下面的代码是:扩展CALayer{func setBorderColorFromUIColor(color:UIColor){self.borderColor=color.CGColor}这个诡计奏效了。部分地。即使我指定了红色,我到底是怎么得到黑色边框的?!!!!!!有什么想法吗?有人吗?@static0886:这是因为您正在应用的颜色没有设置为边框。根据我的理解,我们不能从情节提要设置边框颜色,因为此属性在运行时不会反映在UIComponent中。默认情况下,它是黑色的。如果您想尝试从属性中删除颜色属性。对于swift,您可以将其设置为:self.button.layer.borderColor=在故事板中为我工作的layer.borderColorFromUIColor。谢谢。您好,我正在目标c中创建CustomeView类,但它没有显示在我的故事板中。请帮助我。非常感谢!:)谢谢,非常棒,完美整洁,但是XCode(8.3.3版(8E3004b))在预览中没有显示结果,这是正确的并且没有办法改变(除了创建自定义视图)?这是最优雅的解决方案!干得好!这帮助我在故事板中实现了它。你的答案很清楚,很容易实现。这是这个问题最精确的答案,并有清楚的例子说明。如果你能为Objective-C添加,我们将不胜感激。这是迄今为止我找到的最好的答案。我尝试过这种方法,它使Xcode速度非常慢。这也发生在你们身上吗?