2016-04-06 64 views
1

我正在尝试为UIButton保留边框。如果我使用下面的代码,它工作。为UIButton设置边框

案例:1

[[_myButton layer] setBorderWidth:1.0f]; 
[[_myButton layer] setBorderColor:[UIColor lightGrayColor].CGColor]; 

但在此之前,当我写:

self.baseTypeButton.layer.borderWidth=2.0f; 
self.myButton.layer.borderColor=[UIColor lightGrayColor]; 

的XCode建议我做

enter image description here

现在我的代码更改,但我在这种情况下未能设置边界:

案例:2

_myButton.layer.borderWidth=2.0f; 
_myButton.layer.borderColor=(__bridge CGColorRef _Nullable)([UIColor lightGrayColor]); 

我没有使用自动布局。任何人都可以解释案例1和案例2有什么区别吗?为什么情况-2不会工作。

+0

你加上'#进口'框架? – ivarun

+0

@ivarun:QuartzCore框架已添加到我的项目中 –

+1

UIColor不是CGColor。你无法弥合它。你可以用这个来节省你的时间https://github.com/AlexHsieh/ButtonAppearance – AlexHsieh

回答

4

layer.borderColor必须是CGColor,所以下面的代码将工作。

_myButton.layer.borderWidth=2.0f; 
_myButton.layer.borderColor=[ UIColor lightGrayColor ].CGColor; 

您的代码

[UIColor lightGrayColor] 

返回的UIColor实例,而不是一个CGColor实例。和UIColor无法桥接到CGColor,因此您的演员阵容

(__bridge CGColorRef _Nullable) 

返回意外结果。

您可以使用此代码

NSLog(@"%@", (__bridge CGColorRef _Nullable)([UIColor lightGrayColor])); 

下面返回看到奇怪的结果。 (Xcode 7.3)

2016-04-06 15:30:51.415 36442877[8570:2643221] UIDeviceWhiteColorSpace 0.666667 1 

如果您给borderColor CGColor实例目录,则不需要强制转换。

1

如果你在你的项目比使用ARC,

_myButton.layer.borderWidth=2.0f; 
_myButton.layer.borderColor=(__bridge CGColorRef _Nullable)([UIColor lightGrayColor]); 

就不行,因为__bridge CGColorRef _Nullable会自动释放reference.the时刻CFRelease()被调用走了对象和指向什么。

而且

[[_myButton layer] setBorderWidth:1.0f]; 
[[_myButton layer] setBorderColor:[UIColor lightGrayColor].CGColor]; 

将正常工作。

欲了解更多信息检查:

ARC and bridged cast

+0

在网上搜索ARC,我不是在谈论Xib或自动自动布局@ uday.m –

+0

好的。我明白了你的意思。谢谢 –

+0

太棒了!你是[email protected] –

0

使用此代码

_myButton.layer.borderWidth=2.0f; 
_myButton.layer.borderColor=[UIColor lightGrayColor].CGColor; 
+0

那么,我在插座上使用上面的代码吗? – Shyam