194

是否可以直接从界面生成器控制 UIView 边框属性(颜色、厚度等),或者我只能以编程方式进行控制?

4

9 回答 9

401

实际上,您可以通过界面生成器设置视图层的一些属性。我知道我可以通过xcode设置一个图层的borderWidth和cornerRadius。边框颜色不起作用,可能是因为图层需要 CGColor 而不是 UIColor。

您可能必须使用字符串而不是数字,但它有效!

layer.cornerRadius
layer.borderWidth
layer.borderColor

更新:layer.masksToBounds = true

例子

更新:为 Keypath 选择适当的类型:

在此处输入图像描述

于 2013-04-05T17:28:03.380 回答
187

Rich86Man 的回答是正确的,但是可以使用类别来代理layer.borderColor 等属性。(来自ConventionalC CocoaPod)

CALayer+XibConfiguration.h:

#import <QuartzCore/QuartzCore.h>
#import <UIKit/UIKit.h>

@interface CALayer(XibConfiguration)

// This assigns a CGColor to borderColor.
@property(nonatomic, assign) UIColor* borderUIColor;

@end

CALayer+XibConfiguration.m:

#import "CALayer+XibConfiguration.h"

@implementation CALayer(XibConfiguration)

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

-(UIColor*)borderUIColor
{
    return [UIColor colorWithCGColor:self.borderColor];
}

@end

界面生成器

layer.borderUIColor

结果将在运行时显示,而不是在 Xcode 中。

编辑:您还需要设置layer.borderWidth为至少 1 才能看到所选颜色的边框。

在 Swift 2.0 中:

extension CALayer {
    var borderUIColor: UIColor {
        set {
            self.borderColor = newValue.CGColor
        }

        get {
            return UIColor(CGColor: self.borderColor!)
        }
    }
}

在 Swift 3.0 中:

extension CALayer {
    var borderUIColor: UIColor {
        set {
            self.borderColor = newValue.cgColor
        }

        get {
            return UIColor(cgColor: self.borderColor!)
        }
    }
}
于 2013-08-01T12:19:56.430 回答
93

与 iHulk 类似的答案,但在 Swift 中

在您的项目中添加一个名为 UIView.swift 的文件(或将其粘贴到任何文件中):

import UIKit

@IBDesignable extension UIView {
    @IBInspectable var borderColor: UIColor? {
        set {
            layer.borderColor = newValue?.cgColor
        }
        get {
            guard let color = layer.borderColor else {
                return nil
            }
            return UIColor(cgColor: color)
        }
    }
    @IBInspectable var borderWidth: CGFloat {
        set {
            layer.borderWidth = newValue
        }
        get {
            return layer.borderWidth
        }
    }
    @IBInspectable var cornerRadius: CGFloat {
        set {
            layer.cornerRadius = newValue
            clipsToBounds = newValue > 0
        }
        get {
            return layer.cornerRadius
        }
    }
}

然后,这将在 Interface Builder 中为 Utilities Panel > Attributes Inspector 中的每个按钮、imageView、标签等提供:

属性检查器

注意:边框只会在运行时出现。

于 2016-02-12T21:38:37.207 回答
57

您可以创建一个 UIView 类别并将其添加到类别的 .h 文件中

@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;

现在将其添加到 .m 文件中

@dynamic borderColor,borderWidth,cornerRadius;

这也是在 . 文件

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

-(void)setBorderWidth:(CGFloat)borderWidth{
    [self.layer setBorderWidth:borderWidth];
}

-(void)setCornerRadius:(CGFloat)cornerRadius{
    [self.layer setCornerRadius:cornerRadius];
}

现在您将在故事板中看到所有 UIView 子类(UILabel、UITextField、UIImageView 等)的这一点

在此处输入图像描述

就是这样.. 无需在任何地方导入类别,只需在项目中添加类别的文件并在情节提要中查看这些属性。

于 2015-05-20T11:13:33.713 回答
12

对于Swift 3 和 4,如果你愿意使用IBInspectables,有这个:

@IBDesignable extension UIView {
    @IBInspectable var borderColor:UIColor? {
        set {
            layer.borderColor = newValue!.cgColor
        }
        get {
            if let color = layer.borderColor {
                return UIColor(cgColor: color)
            }
            else {
                return nil
            }
        }
    }
    @IBInspectable var borderWidth:CGFloat {
        set {
            layer.borderWidth = newValue
        }
        get {
            return layer.borderWidth
        }
    }
    @IBInspectable var cornerRadius:CGFloat {
        set {
            layer.cornerRadius = newValue
            clipsToBounds = newValue > 0
        }
        get {
            return layer.cornerRadius
        }
    }
}
于 2017-07-15T13:02:28.357 回答
7

虽然这可能会设置属性,但它实际上并没有反映在 IB 中。因此,如果您本质上是在 IB 中编写代码,那么您不妨在源代码中进行

于 2013-05-28T08:06:12.233 回答
0

layer.masksToBounds = true只有当您设置并休息时,它才是绝对可能的。

于 2018-10-12T06:00:31.260 回答
-1

即使在这里尝试了所有解决方案之后,故事板也不总是对我有用

所以总是完美的答案是使用代码,只需创建 UIView 的 IBOutlet 实例并添加属性

简短的回答:

layer.cornerRadius = 10
layer.borderWidth = 1
layer.borderColor = UIColor.blue.cgColor

长答案:

UIView/UIButton等的圆角

customUIView.layer.cornerRadius = 10

边框厚度

pcustomUIView.layer.borderWidth = 2

边框颜色

customUIView.layer.borderColor = UIColor.blue.cgColor
于 2019-06-12T09:28:33.460 回答
-5

请添加这 2 行简单的代码:

self.YourViewName.layer.cornerRadius = 15
self.YourViewName.layer.masksToBounds = true

它会正常工作。

于 2018-02-06T06:45:43.437 回答