你有没有尝试过在旧版xcode里建立过自定义控件?不是很容易。主要是由于你在Interface Builder(如下简称IB)里看不到实时的效果,每次你要查看修改的效果,只能从新运行,这样很麻烦,你可能要花数小时来设计一个简单的控件。html
Xcode6带来了一个新特性:在IB使用IBDesignable和IBInspectable自定义能够实时预览效果的控件。很是明显,将能极大的提高产品开发效率。ios
在这个教程里,我将给你介绍IBDesignbale和IBInspectable,同时给大家展现若是利用这些特性。没有什么办法能够举个例子更详细了。因此接下来咱们一块儿来打造一个叫“彩虹”的自定义控件。git
有了IBDesignable和IBInspectable,开发者们容许在IB中构造实时渲染效果的界面(或视图),通常来说,要使用这个新特性,你只要建立一个UIView或UIControl的子类,并在类前面加上@IBDesignable关键词(swift),若是你使用的是Object-c,请用IB_DESIGNABLE宏代替,下面是swift的列子:github
@IBDesignable classRainbow: UIView{ }
在老版本xcode中,你能够编辑用户自定义的运行时属性来改变对象的属性(如:layer.conerRadius),麻烦的是你必须在IB中精确的输入同名的属性名称,IBInspectable更加方便,你只要在类属性声明的属性前面加上@IBInspectable,这个属性自动会显示在IB中,不用手工输入,使得改变视图对象的属性更加直观了。如图编程
再重复一遍,若是你使用的swift开发app,你要作的只是在属性前面加上@IBInspectable,例子swift
@IBInspectable varfirstColor:UIColor=UIColor.blackColor(){ // Update your UI when value changes }
还有疑问?别担忧,跟着一块儿作完这个Demo你就彻底懂了。xcode
选择Single View Application模板新建一个工程,命名为RainbowDemo。使用Swift编程语言。app
选中Main.storyboard,拖一个View控件到View Controller里,修改背景色为 #38334C(或随便啥颜色),同时设置大小为600x434。同时把整个容器View的背景色改为与刚拖进来的View同样的颜色。编程语言
小提示:如何设置RGB颜色?在颜色面板有Color Palette,拖动RGB色条来设置。ide
同时在xcode6里必须使用自动布局约束来支持各种型的ios设置,自动布局在最新版的xocde里很是的强大,简单的约束,你只要点击自动布局按钮,并选择“Add Missing Contraints”,xcode将自动给视图添加好约束。
新建一个Swift类型的源文件件,命名为 Rainbow,替换为如下代码
importUIKit classRainbow: UIView{ required init(coder aDecoder:NSCoder){ super.init(coder:aDecoder) } override init(frame:CGRect){ super.init(frame:frame) } }
就像以前说的,它是一个UIView的子类。为了看到实时效果,咱们将窗口分割成两个视图,使用assistant editor
而后在新开的窗口选择Main.storyboard文件,记得修改下你以前拖到UIView视图的控件的类名为Rainbow,这样跟你刚建立的swift源代码是同一个类了。
第一步:在类前面加上@IBDesignable前缀,如
@IBDesignable classRainbow: UIView{ ... }
能够看出来很简单,但这个简单的关键词却使得开发变成更加轻松了。下一步,咱们将要添加一些属性,来设置圆的颜色,添加如下类属性
@IBInspectable varfirstColor:UIColor=UIColor(red:(37.0/255.0),green:(252.0/255 ),blue:(244.0/255.0),alpha:1.0) @IBInspectable varsecondColor:UIColor=UIColor(red:(171.0/255.0),green:(250.0/2 55),blue:(81.0/255.0),alpha:1.0) @IBInspectable varthirdColor:UIColor=UIColor(red:(238.0/255.0),green:(32.0/255 ),blue:(53.0/255.0),alpha:1.0)
同时也预约义了一些默认颜色,而且当每次修改属性时重绘视图。最重要的是,咱们在每一个属性前面加上了关键词@IBInspectable,此时你在IB面板上,你将看到这些属性。
Cool吧,有了IBInspector作指示器,你能够在可视化视图里调整属性了。
下面是实现画一个圆的代码
func addOval(lineWidth: CGFloat, path: CGPathRef, strokeStart: CGFloat, strokeEnd: CGFloat, strokeColor: UIColor, fillColor: UIColor, shadowRadius: CGFloat, shadowOpacity: Float, shadowOffsset: CGSize) { let arc = CAShapeLayer() arc.lineWidth = lineWidth arc.path = path arc.strokeStart = strokeStart arc.strokeEnd = strokeEnd arc.strokeColor = strokeColor.CGColor arc.fillColor = fillColor.CGColor arc.shadowColor = UIColor.blackColor().CGColor arc.shadowRadius = shadowRadius arc.shadowOpacity = shadowOpacity arc.shadowOffset = shadowOffsset layer.addSublayer(arc) }
为了更简洁和可读性,咱们建立了一个画出半圆或全圆的方法,主要使用的是CAShapeLayer类,你可使用strokeStart和strokeEnd来控制起始,调用strokeEnd的范围(0.1至1)你就能够画出一部分圆或全圆出来了。剩下的其它代码是设置颜色和线条、阴影颜色等。你能够点此此处查看CAShapeLayer的全部属性。
下面添加其它具体实现代码
override func drawRect(rect: CGRect) { // Add ARCs self.addCirle(80, capRadius: 20, color: self.firstColor) self.addCirle(150, capRadius: 20, color: self.secondColor) self.addCirle(215, capRadius: 20, color: self.thirdColor) } func addCirle(arcRadius: CGFloat, capRadius: CGFloat, color: UIColor) { let X = CGRectGetMidX(self.bounds) let Y = CGRectGetMidY(self.bounds) // Bottom Oval let pathBottom = UIBezierPath(ovalInRect: CGRectMake((X - (arcRadius/2)), (Y - (arcRadius/2)), arcRadius, arcRadius)).CGPath self.addOval(20.0, path: pathBottom, strokeStart: 0, strokeEnd: 0.5, strokeColor: color, fillColor: UIColor.clearColor(), shadowRadius: 0, shadowOpacity: 0, shadowOffsset: CGSizeZero) // Middle Cap let pathMiddle = UIBezierPath(ovalInRect: CGRectMake((X - (capRadius/2)) - (arcRadius/2), (Y - (capRadius/2)), capRadius, capRadius)).CGPath self.addOval(0.0, path: pathMiddle, strokeStart: 0, strokeEnd: 1.0, strokeColor: color, fillColor: color, shadowRadius: 5.0, shadowOpacity: 0.5, shadowOffsset: CGSizeZero) // Top Oval let pathTop = UIBezierPath(ovalInRect: CGRectMake((X - (arcRadius/2)), (Y - (arcRadius/2)), arcRadius, arcRadius)).CGPath self.addOval(20.0, path: pathTop, strokeStart: 0.5, strokeEnd: 1.0, strokeColor: color, fillColor: UIColor.clearColor(), shadowRadius: 0, shadowOpacity: 0, shadowOffsset: CGSizeZero) }
默认的drawRect什么也没作,为了在UIView上画一个圆,必须本身实现drawRect方法,addCircle()方法须要三个参数:arcRadius, capRadius 和 color。arcRadius是圆的半径,capRadius是彩虹上面小圆盖的半径。
addCircle()使用了UIBezierPath(贝塞尔曲线)来画弧,流程是:
在drawRect方法里,咱们使用不一样的颜色和半径调用了addCircle三次,下图展现了依次的效果
提示:若是你想进一上了解UIBezierPath,请点击
有了IBInspectable属性你能够自由的在IB里控制样式而没必要一头扎进代码里了。
作完这个练习,但愿你能掌握xcode6的IBDesignable和IBInspectable使用。有了这个Interface Builder的实时效果,将提供给你一个更加有效率的自定义组件的方法。
翻译:朱淦 350050183@qq.com 2016.7.20