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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (10)
  • 关注 (0)
  • 查看 (79)

我在检查器处看到我可以更改背景颜色,但我不知道如何更改边框的颜色和厚度。

提问于
用户回答回答于

你需要使用视图层来设置边框属性。例如:

#import <QuartzCore/QuartzCore.h>
...
view.layer.borderColor = [UIColor redColor].CGColor;
view.layer.borderWidth = 3.0f;

你还需要与链接QuartzCore.framework来访问此功能。

用户回答回答于

在iOS 9,SWIFT 2.0上:

extension UIView {

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

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

@IBInspectable var borderColor: UIColor? {
    get {
        if let color = layer.borderColor {
            return UIColor(CGColor: color)
        }
        return nil
    }
    set(newValue) {
        layer.borderColor = newValue?.CGColor
    }
}
用户回答回答于

如果不想编辑UIView的层,则可以始终将视图嵌入到另一个视图中。父视图的背景色将设置为边框颜色。它的边界会稍微大一点,这取决于你想要的边界的宽度。

当然,只有在视图不透明且只需要单一边框颜色时才能使用。OP想要在视图本身的边界,但这可能是一个可行的选择。

用户回答回答于

UIView+Border.h:

#import <UIKit/UIKit.h>

IB_DESIGNABLE
@interface UIView (Border)

-(void)setBorderColor:(UIColor *)color;
-(void)setBorderWidth:(CGFloat)width;
-(void)setCornerRadius:(CGFloat)radius;

@end

UIView+Border.m:

#import "UIView+Border.h"

@implementation UIView (Border)
// Note: cannot use synthesize in a Category

-(void)setBorderColor:(UIColor *)color
{
    self.layer.borderColor = color.CGColor;
}

-(void)setBorderWidth:(CGFloat)width
{
    self.layer.borderWidth = width;
}

-(void)setCornerRadius:(CGFloat)radius
{
    self.layer.cornerRadius = radius;
    self.layer.masksToBounds = radius > 0;
}

@end
用户回答回答于

可以尝试以下代码:

view.layer.borderColor =  [UIColor redColor].CGColor;
view.layer.borderWidth= 2.0;
[view setClipsToBounds:YES];
用户回答回答于

相反,我将修改类的属性如下(在你的自定义uiview中):

  - (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
      self.layer.borderWidth = 2.f;
      self.layer.borderColor = [UIColor redColor].CGColor;
    }
  return self;

我在使用上面的方法时没有看到任何故障——不确定为什么要在initWithFrame停止这些;-)

用户回答回答于

在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
    }
  }
}

然后,你可以直接从属性检查器设置边框颜色和边框属性。

见附图属性检查器

用户回答回答于

当我使用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);    
}
用户回答回答于

你也可以用你想要的颜色来创建边框。

view.layer.borderColor = [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0].CGColor;

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

用户回答回答于

Xcode 6更新

由于Xcode的最新版本有一个更好的解决方案:

通过@IBInspectable,可以直接从Attributes Inspector中设置属性。

然后设置User Defined Runtime Attributes

以下为两种解决方法:

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

  1. 创建MyCustomView...
  2. UIView继承
  3. 设置@IBDesignable(这可以使视图能够动态更新)。*
  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
        }
    }
}

*只有在刚开始设置class MyCustomView的时候,@IBDesignable才能起到作用

选项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
        }
    }
}

你的默认视图总是在属性检查器中有额外的可编辑字段。另一个优点是,你不必每次都将类更改为MycustomView。但还存在一个缺点,只有在运行应用程序时才会看到更改。

扫码关注云+社区