【问题标题】:Set border for UIButton为 UIButton 设置边框
【发布时间】:2026-01-06 01:15:01
【问题描述】:

我正在尝试为 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 建议我做

现在我的代码改变了,但在这种情况下我没有设置边框:

案例:2

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

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

【问题讨论】:

  • 你添加了#import <QuartzCore/QuartzCore.h>框架吗?
  • @ivarun:QuartzCore 框架已添加到我的项目中
  • UIColor 不是 CGColor。你不能桥接它。你可以用它来节省你的时间github.com/AlexHsieh/ButtonAppearance
  • @AlexHsieh:非常感谢您的支持。在您的 github 链接中缺少“AHButton.h”文件。
  • @uday.m ,有两种使用方式。 1. 使用 cocoapod 或 2. 你可以从这里复制文件github.com/AlexHsieh/ButtonAppearance/tree/master/Pod/Classes

标签: ios objective-c uibutton cgcolor


【解决方案1】:

使用此代码

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

【讨论】:

    【解决方案2】:

    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 实例目录,则不需要强制转换。

    【讨论】:

      【解决方案3】:

      如果您在项目中使用 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

      【讨论】:

      • 网上搜索ARC,我说的不是Xib或者auto-autolayout@uday.m