在iPhone上使用CoreGraphics绘制简单的线条

10
我想在用户触摸屏幕的起点和终点之间画一条直线。如果用户重复触摸、拖动和释放操作,则我需要多条线,并且我还需要一个清除所有线的按钮。到目前为止,我有以下代码。但是,一旦再次调用它,我就会收到错误消息:CGContextSetStrokeColor: invalid context 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);
}

你也可以将颜色设置为 ([UIColor blackColor].CGColor); - FeifanZ
这根本不是问题。 - Conor Taylor
5个回答

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);

2
问题在于UIGraphicsGetCurrentContext()会返回空引用。如果你想在UIImage中绘图,可以按照以下方式获取CGContextRef:
UIGraphicsBeginImageContext(anUIImage);

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

...绘制代码写在这里

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

UIGraphicsBeginImageContext() 不能以 UIImage 作为参数调用。 - Julius

2

您还没有定义c的类型:

CGContextRef c = UIGraphicsGetCurrentContext();

我刚刚完成了@implememnation。 - Conor Taylor

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()
}

1

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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接