我试图通过IB建立视图的图层属性。 一切正常,除了边界(财产的颜色layer.borderColor
):
我记得运行到这个问题在一年前,我结束了编程这样做。 而且,我仍然可以以编程方式做到这一点,但我很好奇,为什么layer.borderColor
财产通过界面生成器永远不会奏效。 我不希望导入QuartzCore
,然后写的,只是因为这个额外的代码行,似乎是矫枉过正。
我试图通过IB建立视图的图层属性。 一切正常,除了边界(财产的颜色layer.borderColor
):
我记得运行到这个问题在一年前,我结束了编程这样做。 而且,我仍然可以以编程方式做到这一点,但我很好奇,为什么layer.borderColor
财产通过界面生成器永远不会奏效。 我不希望导入QuartzCore
,然后写的,只是因为这个额外的代码行,似乎是矫枉过正。
这是可能做到这一点,但它不是一个内置功能。 这是因为Color
的用户自定义运行时属性面板类型创建UIColor
,但layer.borderColor
持有CGColorRef
类型。 不幸的是,有没有办法来分配CGColorRef
在Interface Builder类型。
然而,这是可能通过代理属性。 见彼得迪威斯的回答到一个不同的问题,一个可能的解决这个问题。 他的回答定义一个类,允许代理色彩通过Interface Builder中进行设置。
你必须为CALayer的创建类别:
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
然后在用户定义的属性运行时 ,您可以使用它,因为它是在下面的图片:
对于斯威夫特它是更简单:
@IBInspectable var borderColor: UIColor? {
didSet {
layer.borderColor = borderColor?.CGColor
layer.borderWidth = 1
}
}
然后在Xcode中,你可以使用它像这样:
一旦你选择某事物运行时属性,它会自动添加:
我的两分钱用于移植巴特洛梅耶Semańczyk的回答斯威夫特:
创建视图控制器的CALayer的扩展:
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 BorderView : UIView {
@IBInspectable var borderColor: UIColor = .clear {
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中,去身份检查和设置您的视图作为CustomView类。
在此之后,检查你的属性检查器:
无需使用用户定义的属性运行时周围乱了。 而你的变化也将显示在画布上!
使用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
}
}
}
下面就来克服这个的快捷方式。 分类...
@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
。
在夫特,可以扩展UIButton
类和添加@IBInspectable
将使您选择从故事板一种颜色,设置它的颜色(以1宽度是可以改变的)。 在您的视图控制器的末尾添加这样的:
extension UIButton{
@IBInspectable var borderColor: UIColor? {
get {
return UIColor(CGColor: layer.borderColor!)
}
set {
layer.borderColor = newValue?.CGColor
layer.borderWidth = 1
}
}
}
为了使CALayer的KVC兼容的财产borderColorFromUIColor,简单地实现
layer.borderColorFromUIColor=[UIColor red];
此链接有awnser
我遇到了同样的问题,我的工作围绕它通过创建一个自定义按钮:
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,类型从“UIButton的”到“UIButtonWithRoundBorder”改变。
简单和方便了。 :)
我想这可能是因为你必须设置为YES masksToBounds。 我不认为边框层的范围内绘制,这样以来你隐藏了它的边界外的一切也不会被绘制。
borderColor
除非在将不起作用borderWidth
的层的属性被设置为大于0的值。
斯威夫特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
}
}
您可以自定义边框与2种方法。 第一个是这样的。 只需单击对象去的身份检查和设置的属性。
第二个是这样的。 使所需对象的一个IBOutlet,并把这个代码视图做负载。
@IBOutlet weak var uploadView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
uploadView.layer.cornerRadius = 10
uploadView.layer.borderWidth = 1.0
uploadView.layer.borderColor = #colorLiteral(red: 0.08235294118, green: 0.5058823529, blue: 0.9450980392, alpha: 1)
}
swift4
extension CALayer {
open override func setValue(_ value: Any?, forKey key: String) {
/// If key is borderColor, and the value is the type of a UIColor.
if key == "borderColor" , let color = value as? UIColor {
/// After converting UIColor to CGColor, call the system method.
return super.setValue(color.cgColor, forKey: key)
}
super.setValue(value, forKey: key)
}
}