我想在用户触摸屏幕的位置和触摸结束的位置之间绘制一条直线。我需要多行,因为如果用户重复触摸 - 拖动 - 释放动作,我还需要一个按钮来清除所有行。到目前为止,我在下面有这个代码,但是一旦再次调用它,我收到错误: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);
}
答案 0 :(得分:21)
完整的代码如下。
/* 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);
答案 1 :(得分:2)
您尚未定义c
的类型:
CGContextRef c = UIGraphicsGetCurrentContext();
答案 2 :(得分:2)
问题是UIGraphicsGetCurrentContext()
将返回空引用。
如果你想绘制一个UIImage,可以按如下方式获得CGContextRef:
UIGraphicsBeginImageContext(anUIImage);
现在调用UIGraphicsGetCurrentContext()
将不再返回空引用。
...绘画就在这里
UIImage* drawnImage = UIGraphicsGetImageFromCurrentImageContext();
// display the image on an view
UIGraphicsEndImageContext();
答案 3 :(得分:2)
我知道这是一个老问题,但根据答案,我在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()
}
答案 4 :(得分:1)
以下是在单独的图像中绘制线条(网格)然后将此图像(作为叠加层)添加到现有图像的完整示例,在本例中称为“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()