界面生成器中的UIView边框颜色不起作用?
我正尝试通过IB设置视图的图层属性。 除了边框的颜色(属性layer.borderColor
),一切都可以使用:
我记得一年前遇到这个问题,最后我以编程的方式做了这个。 而且,我仍然可以通过编程来实现,但我很好奇为什么layer.borderColor
属性不能通过界面构build器工作。 我不想导入QuartzCore
,然后QuartzCore
编写额外的代码行,似乎是一个矫枉过正的。
这是可能的,但它不是一个内置的function。 这是因为用户定义的运行时属性面板中的Color
types创build了一个UIColor
,但是layer.borderColor
保存了一个CGColorRef
types。 不幸的是,在Interface Builder中没有办法分配一个CGColorRef
types。
但是,这可以通过代理属性来实现。 请参阅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 } }