用CoreGraphics在iPhone上绘制简单线条

我想在用户触摸屏幕的位置和触摸的结束点之间划一条直线。 我需要多行,因为如果用户重复触摸 – 拖放操作,我还需要一个button来清除所有的行。 到目前为止我有下面的代码,但一旦它被再次调用,我收到错误:CGContextSetStrokeColor:无效的上下文0x0。 此错误重复:CGContextBeginPath,CGContextMoveToPoint,CGContextAddLineToPoint,CGContextDrawPath。

有任何想法吗?

- (void)drawRect:(CGRect)rect { c = UIGraphicsGetCurrentContext(); CGFloat black[4] = {0, 0, 0, 1}; CGContextSetStrokeColor(c, black); CGContextBeginPath(c); CGContextMoveToPoint(c, 100, 100); CGContextAddLineToPoint(c, 100, 200); CGContextStrokePath(c); } 

完整的代码如下。

 /* Set the color that we want to use to draw the line */ [[UIColor brownColor] set]; /* Get the current graphics context */ CGContextRef currentContext =UIGraphicsGetCurrentContext(); /* Set the width for the line */ CGContextSetLineWidth(currentContext,5.0f); /* Start the line at this point */ CGContextMoveToPoint(currentContext,50.0f, 10.0f); /* And end it at this point */ CGContextAddLineToPoint(currentContext,100.0f, 200.0f); /* Use the context's current color to draw the line */ CGContextStrokePath(currentContext); 

您尚未定义c

 CGContextRef c = UIGraphicsGetCurrentContext(); 

问题是UIGraphicsGetCurrentContext()将返回一个空引用。 如果你想绘制一个UIImage,你可以得到CGContextRef,如下所示:

 UIGraphicsBeginImageContext(anUIImage); 

现在调用UIGraphicsGetCurrentContext()将不再返回空引用。

绘画在这里

 UIImage* drawnImage = UIGraphicsGetImageFromCurrentImageContext(); // display the image on an view UIGraphicsEndImageContext(); 

我知道这是一个古老的问题,但基于这个答案,我在Swift中写下了以下内容:

 override func drawRect(rect: CGRect) { super.drawRect(rect) UIColor.blackColor().setStroke() // update with correct color let path = UIBezierPath() path.lineWidth = UIScreen.mainScreen().scale > 1 ? 0.5 : 1 // change the points to what you need them to be let leftPoint = CGPointMake(0, CGRectGetHeight(rect)) let rightPoint = CGPointMake(CGRectGetWidth(rect), CGRectGetHeight(rect)) path.moveToPoint(leftPoint) path.addLineToPoint(rightPoint) path.stroke() } 

Swift 3

这里是一个完整的例子,在一个单独的图像中绘制线(网格),然后将这个图像(作为覆盖图)添加到现有的图像,在这种情况下称为“boardImage”。

 // ---------------------------------------------------------------------------------------- // DRAW LINES ON THE BOARD IMAGE // ---------------------------------------------------------------------------------------- private func drawLinesOnBoard() { // 1. DEFINE AN OFFSET AND THE SIZE OF ONE GRIDFIELD let offSet : CGFloat = 20 let fieldWidth : CGFloat = 60 // 2. CREATE A IMAGE GRAPHICS CONTEXT AND DRAW LINES ON IT UIGraphicsBeginImageContext(boardImage.boundsSize) if let currentContext = UIGraphicsGetCurrentContext() { currentContext.setLineWidth(1) // set strokeWidth currentContext.setStrokeColor(UIColor.init(colorLiteralRed: 0.85, green: 1, blue: 0.85, alpha: 0.85).cgColor) currentContext.setLineJoin(.round) currentContext.setLineDash(phase: 1, lengths: [offSet / 4, offSet / 5]) // VERTICAL LINES for multiplyer in (1...5) { let startPoint : CGPoint = CGPoint(x: offSet + CGFloat(multiplyer) * fieldWidth, y: offSet) let endPoint : CGPoint = CGPoint(x: startPoint.x, y: boardImage.frame.height - offSet) /* Start the line at this point */ currentContext.move(to: startPoint) /* And end it at this point */ currentContext.addLine(to: endPoint) } // HORIZONTAL LINES for multiplyer in (1...5) { let startPoint : CGPoint = CGPoint(x: offSet, y: offSet + CGFloat(multiplyer) * fieldWidth) let endPoint : CGPoint = CGPoint(x:boardImage.frame.width - offSet, y: startPoint.y) /* Start the line at this point */ currentContext.move(to: startPoint) /* And end it at this point */ currentContext.addLine(to: endPoint) } currentContext.strokePath() // 3. CREATE AN IMAGE OF THE DRAWN LINES AND ADD TO THE BOARD if let linesImage : UIImage = UIGraphicsGetImageFromCurrentImageContext() { let linesImageView : UIImageView = UIImageView(image: linesImage) let theCenter : CGPoint = CGPoint(x: boardImage.bounds.width / 2, y: boardImage.bounds.height / 2) boardImage.addSubview(linesImageView) linesImageView.center = theCenter isBoardLinesDrawn = true } } // 4. END THE GRAPHICSCONTEXT UIGraphicsEndImageContext()