为UIButton设置边框

时间:2016-04-06 06:09:35

标签: ios objective-c uibutton cgcolor

我正在尝试为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]);

我没有使用自动布局。任何人都可以解释case-1和case-2之间的区别。为什么案例2不会起作用。

3 个答案:

答案 0 :(得分:7)

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 :(得分:1)

如果您在项目中使用ARC而不是

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

无法正常工作,因为__bridge CGColorRef _Nullable会自动释放引用。当调用CFRelease()时,对象就会消失并指向任何内容。

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

将按预期工作。

有关详细信息,请查看:

ARC and bridged cast

答案 2 :(得分:0)

使用此代码

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