Ios 更改情节提要中的UIButton边框颜色
我在用户定义的运行时属性中设置UIbutton的CornerRadius和BorderWidth。无需添加层。borderColor即可正常工作,并以黑色显示边框。但是当添加图层时,borderColor不起作用(不显示边框)Ios 更改情节提要中的UIButton边框颜色,ios,colors,uibutton,storyboard,Ios,Colors,Uibutton,Storyboard,我在用户定义的运行时属性中设置UIbutton的CornerRadius和BorderWidth。无需添加层。borderColor即可正常工作,并以黑色显示边框。但是当添加图层时,borderColor不起作用(不显示边框) 我得到了答案。更改borderColor而不是图层。borderColor: 并将此代码添加到.m文件中: #import <QuartzCore/QuartzCore.h> @implementation CALayer (Additions) - (v
我得到了答案。更改borderColor而不是图层。borderColor: 并将此代码添加到.m文件中:
#import <QuartzCore/QuartzCore.h>
@implementation CALayer (Additions)
- (void)setBorderColorFromUIColor:(UIColor *)color
{
self.borderColor = color.CGColor;
}
@end
#导入
@实施(增补)
-(void)setBorderColorFromUIColor:(UIColor*)颜色
{
self.borderColor=color.CGColor;
}
@结束
勾选属性检查器中的属性
如果使用Swift,则该功能不起作用。您将需要一个计算属性来实现所需的结果:
extension CALayer {
var borderColorFromUIColor: UIColor {
get {
return UIColor(CGColor: self.borderColor!)
} set {
self.borderColor = newValue.CGColor
}
}
}
对于Swift:
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
}
}
}
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 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
}
}
}
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
}
}
}
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
}
}
}
这个解释可能在这里的一些其他答案中丢失了: 未设置此属性的原因是
layer.borderColor
需要类型为CGColor
的值
但是只有UIColor
类型可以通过Interface Builder的用户定义的运行时属性进行设置
因此,必须通过Interface Builder将UIColor设置为代理属性,然后拦截该调用以将等效的CGColor设置为layer.borderColor
属性
这可以通过在CALayer上创建一个类别,将密钥路径设置为一个唯一的新“属性”(borderColorFromUIColor
),并在类别中覆盖相应的setter(setboordcolorfromuicolor:
)来实现
Swift 3,Xcode 8.3
加莱尔分机:
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)
}
}
}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)
}
}
}
如果转到视图的可检查属性,则应直观地找到这些属性,编辑属性:
这些更改也反映在用户定义的运行时属性中:
在构建时运行,瞧!您将看到带有边框的清晰圆形按钮
有一种更好的方法可以做到这一点!您应该使用@IBInspectable。请在此处查看Mike Woelmer的博客:
它实际上在Xcode中为IB添加了这个特性!其他答案中的一些屏幕截图显示,这些字段似乎存在于IB中,但至少在Xcode 9中不存在。但是在他的帖子后面会添加它们。您已经将半径和宽度的数据值设置为字符串,但应该正确地设置为数字,而不是字符串
当你让它工作时,在看故事板时,这将不可见,但当应用程序运行时,除非你已经采取步骤使它@ibdesignable。@jithin我写它作为一个快速扩展,下面的代码是:扩展CALayer{func setBorderColorFromUIColor(color:UIColor){self.borderColor=color.CGColor}这个诡计奏效了。部分地。即使我指定了红色,我到底是怎么得到黑色边框的?!!!!!!有什么想法吗?有人吗?@static0886:这是因为您正在应用的颜色没有设置为边框。根据我的理解,我们不能从情节提要设置边框颜色,因为此属性在运行时不会反映在UIComponent中。默认情况下,它是黑色的。如果您想尝试从属性中删除颜色属性。对于swift,您可以将其设置为:self.button.layer.borderColor=在故事板中为我工作的layer.borderColorFromUIColor。谢谢。您好,我正在目标c中创建CustomeView类,但它没有显示在我的故事板中。请帮助我。非常感谢!:)谢谢,非常棒,完美整洁,但是XCode(8.3.3版(8E3004b))在预览中没有显示结果,这是正确的并且没有办法改变(除了创建自定义视图)?这是最优雅的解决方案!干得好!这帮助我在故事板中实现了它。你的答案很清楚,很容易实现。这是这个问题最精确的答案,并有清楚的例子说明。如果你能为Objective-C添加,我们将不胜感激。这是迄今为止我找到的最好的答案。我尝试过这种方法,它使Xcode速度非常慢。这也发生在你们身上吗?