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

时间:2011-06-13 11:37:13

标签: ios cocoa-touch drawing core-graphics

我想在用户触摸屏幕的位置和触摸结束的位置之间绘制一条直线。我需要多行,因为如果用户重复触摸 - 拖动 - 释放动作,我还需要一个按钮来清除所有行。到目前为止,我在下面有这个代码,但是一旦再次调用它,我收到错误: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);
}

5 个答案:

答案 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)

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