是否可以从界面构建器设置UIView边框属性?

mat*_*ani 180 border interface-builder uiview ios

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

Ric*_*man 385

实际上,您可以通过界面构建​​器设置视图图层的某些属性.我知道我可以通过xcode设置图层的borderWidth和cornerRadius.borderColor不起作用,可能是因为该图层需要CGColor而不是UIColor.

您可能必须使用字符串而不是数字,但它可以工作!

layer.cornerRadius
layer.borderWidth
layer.borderColor
Run Code Online (Sandbox Code Playgroud)

更新:layer.masksToBounds = true

例

更新:为K​​eypath选择合适的类型:

在此输入图像描述

  • 不幸的是,无法以这种方式设置layer.borderColor.它是CGColorRef,但IB颜色值类型是UIColor. (36认同)
  • 所以这就是用户定义的运行时属性所做的!哈哈,自2011年以来一直在为iOS写作,我从来没有学过这些领域的用途.谢谢你这个很棒的答案. (12认同)
  • 另外,不要忘记选中“限制范围”复选框以使cornerRadius起作用。 (4认同)
  • 对你和Peter DeWeese:我使用Xcode 4.6.3并且我可以将keypath类型设置为"Color"而无需实现CALayer接口 (3认同)
  • 很好,但你必须为每个属性设置正确的类型.例如"layer.cornerRadius"的类型必须设置为"Number"而不是"String"! (3认同)
  • 应该是`layer.borderUIColor` (2认同)

Pet*_*ese 179

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Interface Builder

layer.borderUIColor
Run Code Online (Sandbox Code Playgroud)

结果将在运行时显而易见,而不是在Xcode中.

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

在Swift 2.0中:

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

        get {
            return UIColor(CGColor: self.borderColor!)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在Swift 3.0中:

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

        get {
            return UIColor(cgColor: self.borderColor!)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @PeterDeWeese很棒的回答!=) (2认同)

Axe*_*min 78

类似的回答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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

属性检查员

注意:边框仅在运行时出现.

  • 我用这种方法让Interface Builder崩溃,直到我从扩展开头删除了`@ IBDesignable`. (2认同)

iHu*_*ulk 56

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

@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;
Run Code Online (Sandbox Code Playgroud)

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

@dynamic borderColor,borderWidth,cornerRadius;
Run Code Online (Sandbox Code Playgroud)

这也是.m文件

-(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];
}
Run Code Online (Sandbox Code Playgroud)

现在,您将在故事板中看到所有UIView子类(UILabel,UITextField,UIImageView等)

在此输入图像描述

多数民众赞成无需在任何地方导入类别,只需在项目中添加类别的文件,并在故事板中查看这些属性.

  • 多数民众赞成,如果您在接口行之前在.h文件中写入IB_DESIGNABLE,则无需在.m中添加@dynamic行. (3认同)
  • 使用IB_DESIGNABLE补充它以使IB使用drawRect重绘您的自定义视图:方法https://developer.apple.com/library/ios/recipes/xcode_help-IB_objects_media/Chapters/CreatingaLiveViewofaCustomObject.html#//apple_ref/doc/uid/ TP40014224-CH41-SW1 (2认同)

Ram*_*att 10

对于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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Zay*_*ige 7

虽然这可能会设置属性,但它实际上并没有反映在IB中.因此,如果您实际上是在IB中编写代码,那么您可以在源代码中执行此操作

  • 有一个很好的理由:编码配置. (10认同)
  • ^ 这不是MVC。 (2认同)