Cocoa Touch:如何改变UIView的边框颜色和厚度?

for*_*yez 274 iphone cocoa-touch objective-c interface-builder ios

我在检查员看到我可以改变背景颜色,但我也想改变边框颜色和厚度,这可能吗?

谢谢

Vla*_*mir 593

您需要使用视图的图层来设置边框属性.例如:

#import <QuartzCore/QuartzCore.h>
...
view.layer.borderColor = [UIColor redColor].CGColor;
view.layer.borderWidth = 3.0f;
Run Code Online (Sandbox Code Playgroud)

您还需要与QuartzCore.framework链接才能访问此功能.

  • 不再需要`#import <QuartzCore/QuartzCore.h>`. (6认同)
  • 只是为别人着想.Xcode建议将UIColor桥接到CGColorRef作为`__bridge CGColorRef`.这不起作用.它需要是答案中提到的`[UIColor blackColor] .CGColor`. (5认同)
  • @lluismontero我担心你必须用drawRect:方法制作自定义UIView (2认同)

MMa*_*gun 41

Xcode 6更新

自Xcode的最新版本以来,有一个更好的解决方案:

随着@IBInspectable您可以直接设置属性Attributes Inspector.

我的自定义视图@IBInspectable属性

User Defined Runtime Attributes为你设置:

在此输入图像描述

设置此方法有两种方法:

选项1(在Storyboard中进行实时更新)

  1. 创造MyCustomView.
  2. 这继承自UIView.
  3. 设置@IBDesignable(这使View更新生效).*
  4. 使用设置运行时属性(边框等) @IBInspectable
  5. 将您的视图类更改为 MyCustomView
  6. 在"属性"面板中编辑并查看Storyboard中的更改:)

`

@IBDesignable
class MyCustomView: UIView {
    @IBInspectable var cornerRadius: CGFloat = 0 {
        didSet {
            layer.cornerRadius = cornerRadius
            layer.masksToBounds = cornerRadius > 0
        }
    }
    @IBInspectable var borderWidth: CGFloat = 0 {
        didSet {
            layer.borderWidth = borderWidth
        }
    }
    @IBInspectable var borderColor: UIColor? {
        didSet {
            layer.borderColor = borderColor?.CGColor
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

*@IBDesignable仅在开头设置时有效class MyCustomView

选项2(自Swift 1.2起不起作用,见评论)

扩展你的UIView类:

extension UIView {
    @IBInspectable var cornerRadius: CGFloat = 0 {
        didSet {
            layer.cornerRadius = cornerRadius
            layer.masksToBounds = cornerRadius > 0
        }
    }
    @IBInspectable var borderWidth: CGFloat = 0 {
        didSet {
            layer.borderWidth = borderWidth
        }
    }
    @IBInspectable var borderColor: UIColor? {
        didSet {
            layer.borderColor = borderColor?.CGColor
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,您的默认视图总是包含那些额外的可编辑字段Attributes Inspector.另一个优点是您不必MycustomView每次都更改类.但是,这样做的一个缺点是,只有在运行应用程序时才会看到更改.


roh*_*tel 17

您还可以使用您希望的颜色创建边框.

view.layer.borderColor = [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0].CGColor;
Run Code Online (Sandbox Code Playgroud)

*r,g,b是0到255之间的值.

  • 值得注意的是,`r`,`g`和`b`应该是浮点数; 除数也应该是浮点数:`r/255.0`. (6认同)

小智 10

在UIView扩展中添加以下@IBInspectables

extension UIView {

  @IBInspectable var borderWidth: CGFloat {
    get {
      return layer.borderWidth
    }
    set(newValue) {
      layer.borderWidth = newValue
    }
  }

  @IBInspectable var borderColor: UIColor? {
    get {
      if let color = layer.borderColor {
        return UIColor(CGColor: color)
      }
      return nil
    }
    set(newValue) {
      layer.borderColor = newValue?.CGColor
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,您应该能够直接从"属性"检查器设置borderColor和borderWidth属性.见附图

属性检查员


Nic*_*rdu 8

当我使用Vladimir的CALayer解决方案时,在视图的顶部我有一个动画,就像模态UINavigationController解雇一样,我看到很多故障发生并且有绘图性能问题.

所以,实现这一目标的另一种方法是,制作一个自定义的UIView并实现如下drawRect消息:但没有毛刺和性能损失:

- (void)drawRect:(CGRect)rect
{
    CGContextRef contextRef = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(contextRef, 1);
    CGContextSetRGBStrokeColor(contextRef, 255.0, 255.0, 255.0, 1.0);
    CGContextStrokeRect(contextRef, rect);    
}
Run Code Online (Sandbox Code Playgroud)


Vik*_*wal 7

试试这段代码:

view.layer.borderColor =  [UIColor redColor].CGColor;
view.layer.borderWidth= 2.0;
[view setClipsToBounds:YES];
Run Code Online (Sandbox Code Playgroud)


小智 7

view.layer.borderWidth = 1.0
view.layer.borderColor = UIColor.lightGray.cgColor
Run Code Online (Sandbox Code Playgroud)