我在用户定义的运行时属性中为UIbutton设置了CornerRadius和BorderWidth。在不添加layer.borderColor的情况下,它能够正常工作并以黑色显示边框。但是当添加layer.borderColor后不起作用(不显示边框)。
我在用户定义的运行时属性中为UIbutton设置了CornerRadius和BorderWidth。在不添加layer.borderColor的情况下,它能够正常工作并以黑色显示边框。但是当添加layer.borderColor后不起作用(不显示边框)。
针对Swift:
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
属性检查器中的 "Tick" 属性
Swift 4,Xcode 9.2 - 使用IBDesignable
和IBInspectable
构建自定义控件,并在Interface Builder中实时预览设计。
这是一个Swift的示例代码,只需将其放置在ViewController.swift文件中的UIKit
下方:
@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)
}
}
}
如果您进入视图的属性检查器,您应该可以在其中找到这些属性并进行可视化编辑:
更改也将反映在“用户定义的运行时属性”中:
在构建时运行,Voila!你会看到有边框和圆角的按钮。
layer.borderColor
未被设置的原因是需要使用类型为CGColor
的值。UIColor
类型!layer.borderColor
属性的CGColor设置为它。borderColorFromUIColor
),并在类别中覆盖相应的setter (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)
}
}
}
有一种更好的方法来实现这个!您应该使用@IBInspectable。在Mike Woelmer的博客文章中查看此功能: https://spin.atomicobject.com/2017/07/18/swift-interface-builder/
它实际上将该功能添加到Xcode的IB中!其他答案中的一些截图似乎表明这些字段存在于IB中,但至少在Xcode 9中它们不存在。但是遵循他的帖子将会添加它们。
extension CALayer {
var borderColorFromUIColor: UIColor {
get {
return UIColor(CGColor: self.borderColor!)
} set {
self.borderColor = newValue.CGColor
}
}
}
你将半径和宽度的数据值设置为字符串,但实际上应该设置为数字,而不是字符串。
当你使其正常工作时,在查看故事板时这是不可见的,但在应用程序运行时会显示出来,除非你已经采取措施使其成为@IBDesigneable。