前言:
用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):
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))
}
}
那么就直接看下效果吧:
例子2: 怎么在CustomView上的子视图的属性在IB上设置呢?:
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
}
}
那么就看下自定义的DrawView在IB上Label属性设置效果:
例子3: 怎么在IB上设置layer的一些属性值呢?
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
}
}
}
在User Defined Runtime Attributes 中KeyPath不用自己填写,在设置的时候会自动填充上!还是看下效果吧:
例子4: 看到这里可能还会说是不是每个视图用到layer都这么费劲?答案:不会的 搞个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;
}
}
}
请发表评论