在Interface Builder中的UIView的边框颜色不起作用?(UIView's

2019-07-19 16:27发布

我试图通过IB建立视图的图层属性。 一切正常,除了边界(财产的颜色layer.borderColor ):

我记得运行到这个问题在一年前,我结束了编程这样做。 而且,我仍然可以以编程方式做到这一点,但我很好奇,为什么layer.borderColor财产通过界面生成器永远不会奏效。 我不希望导入QuartzCore ,然后写的,只是因为这个额外的代码行,似乎是矫枉过正。

Answer 1:

这是可能做到这一点,但它不是一个内置功能。 这是因为Color的用户自定义运行时属性面板类型创建UIColor ,但layer.borderColor持有CGColorRef类型。 不幸的是,有没有办法来分配CGColorRef在Interface Builder类型。

然而,这是可能通过代理属性。 见彼得迪威斯的回答到一个不同的问题,一个可能的解决这个问题。 他的回答定义一个类,允许代理色彩通过Interface Builder中进行设置。



Answer 2:

你必须为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中,你可以使用它像这样:

一旦你选择某事物运行时属性,它会自动添加:



Answer 3:

我的两分钱用于移植巴特洛梅耶Semańczyk的回答斯威夫特:

创建视图控制器的CALayer的扩展:

import UIKit

extension CALayer {
    func borderUIColor() -> UIColor? {
        return borderColor != nil ? UIColor(CGColor: borderColor!) : nil
    }

    func setBorderUIColor(color: UIColor) {
        borderColor = color.CGColor
    }
}


Answer 4:

复制并粘贴到这个类:

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类。

在此之后,检查你的属性检查器:

无需使用用户定义的属性运行时周围乱了。 而你的变化也将显示在画布上!



Answer 5:

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


Answer 6:

下面就来克服这个的快捷方式。 分类...

@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



Answer 7:

在夫特,可以扩展UIButton类和添加@IBInspectable将使您选择从故事板一种颜色,设置它的颜色(以1宽度是可以改变的)。 在您的视图控制器的末尾添加这样的:

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


Answer 8:

为了使CALayer的KVC兼容的财产borderColorFromUIColor,简单地实现

layer.borderColorFromUIColor=[UIColor red];

此链接有awnser



Answer 9:

我遇到了同样的问题,我的工作围绕它通过创建一个自定义按钮:

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”改变。

简单和方便了。 :)



Answer 10:

我想这可能是因为你必须设置为YES masksToBounds。 我不认为边框层的范围内绘制,这样以来你隐藏了它的边界外的一切也不会被绘制。



Answer 11:

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.


Answer 12:

您可以在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
    }
}


Answer 13:

您可以自定义边框与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)
    }


Answer 14:

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


文章来源: UIView's border color in Interface builder doesn't work?