才接触iOS开发的时候,以为有件事很是奇怪,Xcode中组件有不少,但却没有一条线的组件。当时想到应该能够经过UIView将高度设置为1,就能够获得一条线了吧,不过放在视图里面就是需设置各类线束。也下分不便。更要命的时候,有时想要画一个框,再来一个View上放一个View,再调整位置的话,那真是一场恶梦。想一想真是太无知了,这种思惟方式安全就是按PS或是AI的绘图方式来作,但惋惜iOS不吃这一套。安全
后来才知道,UIView就至关于一个画版,而只要你有足够的想像力,你就可使用代码在这张画板上作出各类画来,固然像绘制线条、矩形框之类的,可是小菜一碟。ide
要线一条线,无非就是告诉画笔起点,再说提明终点,给出线条的粗细,颜色,如此这般就能够绘出一条线来了。spa
前面咱们说过,UIView就是一张画板,而这条画板默认状况下,就只能堆放一些组件,就是一张空白的,你想画上东西,就得本身从新定义它。code
在Xcode中,你能够建立一个以UIView为SuperClass的子类,而后再在drawRect(rect:)
中使用代码绘出线条便可。blog
绘制线条,须要使用到UIBezierPath
这个类。图片
let linePath = UIBezierPath() // 将画笔移动到起点位置 linePath.moveToPoint(CGPoint(x: 30, y: 120)) // 绘到 (290, 120)这个点 linePath.addLineToPoint(CGPoint(x: 290, y: 120)) linePath.addLineToPoint(CGPoint(x: 30, y: 240)) linePath.addLineToPoint(CGPoint(x: 290, y: 240)) // 线的粗线 linePath.lineWidth = 2.0 // 线条颜色 UIColor.redColor().setStroke() // 绘出线条 linePath.stroke()
这里绘出的是一条实线,若是须要绘出虚线怎么呢?能够这样作:开发
// 画虚线 let context = UIGraphicsGetCurrentContext() let dashedPath = UIBezierPath() dashedPath.moveToPoint(CGPoint(x: 30, y: 280)) dashedPath.addLineToPoint(CGPoint(x: 290, y: 280)) CGContextSaveGState(context) CGContextSetLineDash(context, 0, [10, 10], 2) dashedPath.lineWidth = 3.0 dashedPath.stroke() CGContextRestoreGState(context)
在模拟里跑下,能够看到这样的效果:it
这是直线的画法,若是是绘制一个矩形的话,能够这样作:table
@IBDesignable class RectView: UIView { // 边框颜色 @IBInspectable var strokeColor: UIColor = UIColor.blackColor() // 填充色 @IBInspectable var fillColor: UIColor = UIColor.whiteColor() // 线的粗细 @IBInspectable var lineWidth: CGFloat = 1.0 override func drawRect(rect: CGRect) { // 实线矩形 // 位置、长、宽 let rectPath = UIBezierPath(rect: CGRectMake(30, 80, 260, 120)) // 设置边框颜色 strokeColor.setStroke() // 线的粗细 rectPath.lineWidth = lineWidth // 开始绘制 rectPath.stroke() // 对矩形框进行填充 fillColor.setFill() rectPath.fill() // 绘制虚线框 let context = UIGraphicsGetCurrentContext() let dashedRect = UIBezierPath(rect: CGRectMake(30, 220, 260, 120)) dashedRect.lineWidth = lineWidth CGContextSaveGState(context) CGContextSetLineDash(context, 5, [10, 10], 2) strokeColor.setStroke() dashedRect.stroke() CGContextRestoreGState(context) } }
运行起来的效果是这样的:class
这里有了两个新的方法,一个是@IBDesignable
,另外一个是@IBInspectable
,他们有什么做用呢?
通常状况下,咱们使用代码写出来的图,是Storyboard里是看不以的,只能运行在模拟器中才能看到效果,这种太过于考验写代码者的水平了,若是能边写代码,边看到图形的效果,那就太好了。因而@IBDesignable
就闪亮登场了。有了,你就能够边写代码,边看到效果了。
那@IBInspectable
又是干什么的呢?他是将代码里的变量添加到Xcode的变量列表中,这就样就在GUI状态下,直接修改代码中的参数了。像这样:
终于解决了这个技术难题,感受本身的开发水平进步了一大截。继续加油!