我在用户定义的运行时属性中为UIbutton设置CornerRadius和BorderWidth。如果不添加layer.borderColor,它将正常工作,并以黑色显示边框。但是,当添加layer.borderColor不起作用(不显示边框)。
我在用户定义的运行时属性中为UIbutton设置CornerRadius和BorderWidth。如果不添加layer.borderColor,它将正常工作,并以黑色显示边框。但是,当添加layer.borderColor不起作用(不显示边框)。
Answers:
对于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
}
}
}
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
}
}
}
我得到了答案。更改 borderColor而不是layer.borderColor:
并将此代码添加到.m文件中:
#import <QuartzCore/QuartzCore.h>
@implementation CALayer (Additions)
- (void)setBorderColorFromUIColor:(UIColor *)color
{
self.borderColor = color.CGColor;
}
@end
属性检查器中的刻度属性
Swift 4,Xcode 9.2-使用IBDesignable
和IBInspectable
构建自定义控件,并在Interface Builder中实时预览设计。
这是Swift中的示例代码,UIKit
位于ViewController.swift的正下方:
@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)
}
}
}
如果转到视图的可检查属性,则应在视觉上找到这些属性,然后编辑属性:
更改还反映在用户定义的运行时属性中:
运行构建时间,瞧!您将看到带有边框的清晰的圆形按钮。
可能在其他一些答案中迷失了解释:
未设置此属性的原因是layer.borderColor
需要一个type值CGColor
。
但是只能UIColor
通过Interface Builder的用户定义的运行时属性来设置类型!
因此,您必须通过Interface Builder将UIColor设置为代理属性,然后拦截该调用以将等效的CGColor设置为该layer.borderColor
属性。
这可以通过在CALayer上创建类别,将密钥路径设置为唯一的新“属性”(borderColorFromUIColor
),并在类别中覆盖相应的设置器(setBorderColorFromUIColor:
)来实现。
这对我有用。
Swift 3,Xcode 8.3
CALayer扩展名:
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)
}
}
}