界面生成器中的UIView边框颜色不起作用?

我正尝试通过IB设置视图的图层属性。 除了边框的颜色(属性layer.borderColor ),一切都可以使用:

在这里输入图像说明

我记得一年前遇到这个问题,最后我以编程的方式做了这个。 而且,我仍然可以通过编程来实现,但我很好奇为什么layer.borderColor属性不能通过界面构build​​器工作。 我不想导入QuartzCore ,然后QuartzCore编写额外的代码行,似乎是一个矫枉过正的。

这是可能的,但它不是一个内置的function。 这是因为用户定义的运行时属性面板中的Colortypes创build了一个UIColor ,但是layer.borderColor保存了一个CGColorReftypes。 不幸的是,在Interface Builder中没有办法分配一个CGColorReftypes。

但是,这可以通过代理属性来实现。 请参阅Peter DeWeese针对这个问题的一个可能的解决scheme的另一个问题的答案 。 他的答案定义了一个允许通过Interface Builder设置代理颜色的类别。

您必须为CALayer创build类别:

CALayer的+ UIColor.h

 #import <QuartzCore/QuartzCore.h> #import <UIKit/UIKit.h> @interface CALayer(UIColor) // This assigns a CGColor to borderColor. @property(nonatomic, assign) UIColor* borderUIColor; @end 

CALayer的+ UIColor.m

 #import "CALayer+UIColor.h" @implementation CALayer(UIColor) - (void)setBorderUIColor:(UIColor*)color { self.borderColor = color.CGColor; } - (UIColor*)borderUIColor { return [UIColor colorWithCGColor:self.borderColor]; } @end 

然后在User Defined Runtime属性中,您可以像下面这样使用它:

在这里输入图像说明

对于Swift来说,要简单得多:

 @IBInspectable var borderColor: UIColor? { didSet { layer.borderColor = borderColor?.CGColor layer.borderWidth = 1 } } 

然后在Xcode中,你可以像这样使用它:

在这里输入图像说明

一旦你select了它自动添加到你的运行时属性

我将两个美分移植到Swift的BartłomiejSemańczyk的答案:

在视图控制器中为CALayer创build一个扩展:

 import UIKit extension CALayer { func borderUIColor() -> UIColor? { return borderColor != nil ? UIColor(CGColor: borderColor!) : nil } func setBorderUIColor(color: UIColor) { borderColor = color.CGColor } } 

剪切并粘贴这个类:

 import UIKit @IBDesignable class CustomView : UIView { @IBInspectable var borderColor: UIColor = UIColor.clearColor() { didSet { layer.borderColor = borderColor.CGColor } } @IBInspectable var borderWidth: CGFloat = 0 { didSet { layer.borderWidth = borderWidth } } @IBInspectable var cornerRadius: CGFloat = 0 { didSet { layer.cornerRadius = cornerRadius } } } 

现在在Interface Builder中,转到Identity检查器并将您的视图设置为CustomView类。

现在检出您的属性检查器: 在这里输入图像说明

不需要再乱用用户定义的运行时属性。 而且你的改变也会显示在canvas上!

这是解决这个问题的一个快速方法。 分类…

 @interface UIView (IBAppearance) @property (nonatomic, strong) UIColor *borderColor; @end 

你不需要存储它,只是很好,所以你可以稍后查询。 重要的是获取值并将UIColor的CGColor分配给图层。

 #import <objc/runtime.h> #define BORDER_COLOR_KEYPATH @"borderColor" @implementation UIView (IBAppearance) - (void)setBorderColor:(UIColor *)borderColor { UIColor *bc = objc_getAssociatedObject(self, BORDER_COLOR_KEYPATH); if(bc == borderColor) return; else { objc_setAssociatedObject(self, BORDER_COLOR_KEYPATH, borderColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC); self.layer.borderColor = [borderColor CGColor]; } } - (UIColor *)borderColor { return objc_getAssociatedObject(self, BORDER_COLOR_KEYPATH); } @end 

当然,在界面生成器中,您不是在layer.borderColor上设置值,而是在borderColor上设置值。

使用IBDesignable而不是运行时属性更清晰。

把这段代码放在任何类中,并直接在故事板上编辑属性。

 import UIKit @IBDesignable extension UIView { @IBInspectable var borderColor:UIColor? { set { layer.borderColor = newValue!.CGColor } get { if let color = layer.borderColor { return UIColor(CGColor:color) } else { return nil } } } @IBInspectable var borderWidth:CGFloat { set { layer.borderWidth = newValue } get { return layer.borderWidth } } @IBInspectable var cornerRadius:CGFloat { set { layer.cornerRadius = newValue clipsToBounds = newValue > 0 } get { return layer.cornerRadius } } } 

在Swift中,可以扩展UIButton类并添加一个@IBInspectable ,使您可以从故事板中select一种颜色并设置其颜色(宽度为1,可以更改)。 在你的视图控制器的最后添加这个:

 extension UIButton{ @IBInspectable var borderColor: UIColor? { get { return UIColor(CGColor: layer.borderColor!) } set { layer.borderColor = newValue?.CGColor layer.borderWidth = 1 } } } 

为了使属性borderColorFromUIColor的CALayer KVC兼容,只需执行

 layer.borderColorFromUIColor=[UIColor red]; 

这个链接有awnser

我遇到了同样的问题,我通过创build一个自定义button类来解决它:

 class UIButtonWithRoundBorder: UIButton { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.layer.cornerRadius = 6 self.layer.borderWidth = 1 self.layer.borderColor = UIColor.whiteColor().CGColor self.clipsToBounds = true } } 

然后在IB中,将types从“UIButton”更改为“UIButtonWithRoundBorder”。

简单,方便。 🙂

我想这可能是因为你有masksToBounds设置为YES。 我不认为边界是在图层的边界内,所以不会被画出来,因为你把所有的东西都隐藏起来了。

borderColor将无法工作,除非图层的borderWidth属性设置为大于0的值。

Swift 3:

 button.layer.borderColor = UIColor.white.cgColor button.layer.borderWidth = 1.0 // Default value is 0, that's why omitting this line will not make the border color show. 

您可以在XIB中为“borderColor”键设置一个值,并使用:

 extension UIView { open override func setValue(_ value: Any?, forKey key: String) { guard key == "borderColor", let color = value as? UIColor else { super.setValue(value, forKey: key) return } layer.borderColor = color.cgColor } }