Рисование простых линий на iPhone с помощью CoreGraphics - PullRequest
9 голосов
/ 13 июня 2011

Я хотел бы провести прямую линию между тем, где пользователь касается экрана, и тем, где заканчивается касание. Мне нужно несколько строк, потому что если пользователь повторяет действие «нажатие-перетаскивание», и мне также нужна кнопка, чтобы очистить все строки. Пока у меня есть этот код ниже, но как только он вызывается снова, я получаю ошибки: 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 ]

21 голосов
/ 13 июня 2011

Полный код приведен ниже.

/* 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 голосов
/ 20 июля 2016

Я знаю, что это старый вопрос, но на основании ответа я написал следующее в 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()
}
2 голосов
/ 28 июня 2011

Проблема в том, что UIGraphicsGetCurrentContext() вернет нулевую ссылку.Если вы хотите нарисовать в UIImage, вы можете получить CGContextRef следующим образом:

UIGraphicsBeginImageContext(anUIImage);

теперь вызов UIGraphicsGetCurrentContext() больше не будет возвращать нулевую ссылку.здесь

UIImage* drawnImage = UIGraphicsGetImageFromCurrentImageContext();
// display the image on an view
UIGraphicsEndImageContext();  
2 голосов
/ 13 июня 2011

Вы не определили тип для c:

CGContextRef c = UIGraphicsGetCurrentContext();
1 голос
/ 21 апреля 2017

Свифт 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()
...