@IBDesignable和@IBInspectable

 前言:

用storyboard/xib搞项目时,一些属性在Interface Builder上时无法设置,比如常用的layer的一些属性
cornerRadius,borderColor等 (有时没必须的关联属性 用代码去设置)。估计大家也都想省事,能Interface Builder解决的绝不代码(特殊情况外),搞个复杂点的界面加上约束条件,我x还不疯了 时间都玩它了。但是wwdc2014其中要解决的问题时:

  • 写的code怎么在Interface Builder动态预览效果?
  • code中的属性是否可以在Interface Builder上设置?

上边的2个问题就是这篇文章要解决的了:也就是在xcode6中苹果给提供了@IBDesignable和@IBInspectable   这里时必须时UIView/NSView子类使用,看到这可能要冒出 :“No Code you say a JB a”  

例子1:那么废话少说直接先swift为例drawRect看下效果(注:UIView/NSView):
[cc lang=”c”]

@IBDesignable   // 记得@IBDesignable添加 它就是告诉IB可以动态预览
class SView: UIView {

override func drawRect(rect:CGRect) {
var context:CGContextRef = UIGraphicsGetCurrentContext()
CGRectInset(CGRectMake(0, 0, 30, 30), 5, 5)
UIColor.yellowColor().set()
CGContextSetLineWidth(context, 22)
UIRectFrame(CGRectMake(0, 0, 30, 30))
}
}

[/cc]

那么就直接看下效果吧:

ibdesiginbleeruntime

 

例子2: 怎么在CustomView上的子视图的属性在IB上设置呢?:

[cc lang=”c”]
class DrawView: UIView {

var runLabel: UILabel!
@IBInspectable var labelTitle: String!
@IBInspectable var labelColor: UIColor!

override init(frame: CGRect) {
super.init(frame: frame)

labelTitle = “一起扯扯”
labelColor = UIColor.blackColor()
runLabel = UILabel(frame:CGRectMake(0, 0, 180, 80))
runLabel.textColor = labelColor
runLabel.text      = labelTitle
addSubview(runLabel)
}

required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)

labelTitle = “一起扯扯”
labelColor = UIColor.blackColor()
runLabel = UILabel(frame:CGRectMake(0, 0, 180, 80))
runLabel.textColor = labelColor
runLabel.text      = labelTitle
addSubview(runLabel)
}

override func layoutSubviews() {
runLabel.textColor = labelColor
runLabel.text      = labelTitle
}
}
[/cc]

那么就看下自定义的DrawView在IB上Label属性设置效果:

perpthre

例子3: 怎么在IB上设置layer的一些属性值呢?
[cc lang=”c”]
@IBDesignable
class SView: UIView {

@IBInspectable var cornerRadius: CGFloat = 0 {
didSet {
layer.cornerRadius = cornerRadius
}
}

@IBInspectable var borderWidth: CGFloat = 0 {
didSet {
layer.borderWidth = borderWidth
}
}

@IBInspectable var borderColor: UIColor? {
didSet {
layer.borderColor = borderColor?.CGColor
}
}
}
[/cc]
在User Defined Runtime Attributes 中KeyPath不用自己填写,在设置的时候会自动填充上!还是看下效果吧:perptwo

 

例子4: 看到这里可能还会说是不是每个视图用到layer都这么费劲?答案:不会的 搞个UIView扩展就省事多点了!
[cc lang=”c”]
extension UIView {
@IBInspectable var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
set {
layer.cornerRadius = newValue
layer.masksToBounds = newValue > 0
}
}

@IBInspectable var borderColor:CGColor {

get {
return layer.borderColor
}
set {
layer.borderColor = borderColor;
}
}
}

[/cc]

总结:看来storyboard/xib越来越强大了,以后做程序还是要 靠效率不能把时间浪费在无意义的控件上!此文章会一直更新

发表回复

电子邮件地址不会被公开。 必填项已用*标注