可可触摸:如何改变UIView's边界颜色和厚度?

我在检查器中看到我可以改变背景颜色,但是我想改变边框的颜色和粗细,可以吗?

213501 次浏览

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

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

你还需要链接到QuartzCore.framework来访问这个功能。

你也可以创建边界的颜色你的愿望..

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之间的值。

如果你想在不同的边线上添加不同的边框,可能添加一个带有特定样式的子视图是一种容易想出的方法。

当我使用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);
}

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

当然,这只适用于你的视图不是透明的,你只想要一个单一的边界颜色。OP希望在视图本身的边界,但这可能是一个可行的替代方案。

我不建议重写drawRect,因为这会导致性能下降。

相反,我将修改类的属性如下(在你的自定义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会停止这些;-)

Xcode 6更新

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

使用@IBInspectable,你可以直接从Attributes Inspector设置属性。

My Custom View @IBInspectable Attributes

这为你设置了User Defined Runtime Attributes:

enter image description here

有两种方法可以设置:

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

  1. 创建MyCustomView
  2. 它继承自UIView
  3. 设置@IBDesignable(这使得视图更新实时)
  4. @IBInspectable设置你的运行时属性(边界等)
  5. 将视图类更改为MyCustomView
  6. 在属性面板中编辑,并在故事板中查看更改:)

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

* @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
}
}
}
这样,你的默认视图总是Attributes Inspector中有那些额外的可编辑字段。另一个优点是你不必每次都将类更改为MycustomView。 然而,这样做的一个缺点是,你只能在运行应用程序时看到你的更改

我想把这个添加到@marczking的答案(选项1)作为评论,但我在StackOverflow上的低级状态阻止了这一点。

我把@marczking对Objective c的回答做了一个移植,非常有魅力,谢谢@marczking!

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

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

然后你应该能够从属性检查器中直接设置borderColor和borderWidth属性。见附图

属性检查器

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

试试下面的代码:

view.layer.borderColor =  [UIColor redColor].CGColor;
view.layer.borderWidth= 2.0;
[view setClipsToBounds:YES];
view.layer.borderWidth = 1.0
view.layer.borderColor = UIColor.lightGray.cgColor

swift 4.2中项目的边框颜色:

let cell = tableView.dequeueReusableCell(withIdentifier: "Cell_lastOrderId") as! Cell_lastOrder
cell.layer.borderWidth = 1
cell.layer.borderColor = UIColor.white.cgColor
cell.layer.cornerRadius = 10

(self。view。layer setBorderColor: [uicolcolorwithred:0.265 green:0.447 blue:0.767 alpha:1.0f].CGColor];