Рисование горизонтальной линии в печатном pdf с использованием UIPrintPageRenderer - PullRequest
3 голосов
/ 14 июля 2011

Я использую подкласс UIPrintPageRenderer для печати html-содержимого в формате pdf.Как я могу добавить горизонтальную линию на мой печатный контент (как в верхнем, так и в нижнем колонтитуле)?

CGContextAddLineToPoint не работает в методах UIPrintPageRenderer.В частности те, которые используются для рисования верхнего и нижнего колонтитула.DrawAtPoint от NSString работает отлично.

Вот что я пробовал до сих пор:

- (void)drawHeaderForPageAtIndex:(NSInteger)pageIndex inRect:(CGRect)headerRect {
    ...

    // Attempt 1 (Doesn't work!)
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetRGBFillColor(context, 1.0f, 1.0f, 1.0f, 1);
    CGContextSetRGBStrokeColor(context, 1.0f, 1.0f, 1.0f, 1);
    CGContextMoveToPoint(context, 10.0, 20.0);
    CGContextAddLineToPoint(context, 310.0, 20.0);

    // Attempt 2 (Doesn't work!)
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetRGBFillColor(context, 1.0f, 1.0f, 1.0f, 1);
    CGContextSetRGBStrokeColor(context, 1.0f, 1.0f, 1.0f, 1);

    CGContextTranslateCTM(context, 0, headerRect.size.height);
    CGContextScaleCTM(context, 1, -1);

    CGContextMoveToPoint(context, 10.0, 20.0);
    CGContextAddLineToPoint(context, 310.0, 20.0);
}

Ответы [ 3 ]

1 голос
/ 31 января 2013

В Core Graphics элементы логической графики добавляются в контекст, а затем отрисовываются.Я вижу, как вы добавляете путь к контексту с помощью, например, CGContextAddLineToPoint(context, 310.0, 20.0);

. Это создает путь в памяти, но для компоновки его на экране вам нужно либо заполнить, либо пролистать путь контекста.Попробуйте добавить CGContextStrokePath(context); после того, как на самом деле очертите путь.

1 голос
/ 01 июня 2015

Так же, как обычный рисунок

- (void)drawHeaderForPageAtIndex:(NSInteger)pageIndex inRect:(CGRect)headerRect {

    CGContextRef context = UIGraphicsGetCurrentContext();

    CContextMoveToPoint(context, CGRectGetMinX(headerRect), 70);
    CGContextAddLineToPoint(context, CGRectGetMaxX(headerRect), 70);

    CGFloat grayScale = 0.5f;
    CGContextSetRGBStrokeColor(context, grayScale, grayScale, grayScale, 1);

    CGContextStrokePath(context);
}

Не забудьте CGStrokePath(...)

0 голосов
/ 14 июля 2011

Итак, сейчас я применил альтернативное решение.Я все еще хотел бы знать, как сделать это, используя CGContext (без необходимости загружать изображение).Вот мое решение:

// Draw horizontal ruler in the header
UIImage *horizontalRule = [UIImage imageNamed:@"HorizontalRule.png"];
horizontalRule = [horizontalRule stretchableImageWithLeftCapWidth:0.5 topCapHeight:0];

CGFloat rulerX = CGRectGetMinX(headerRect) + HEADER_LEFT_TEXT_INSET;
CGFloat rulerY = self.printableRect.origin.y + fontSize.height + HEADER_FOOTER_MARGIN_PADDING + PRINT_RULER_MARGIN_PADDING;
CGFloat rulerWidth = headerRect.size.width - HEADER_LEFT_TEXT_INSET - HEADER_RIGHT_TEXT_INSET;
CGFloat rulerHeight = 1;
CGRect ruleRect = CGRectMake(rulerX, rulerY, rulerWidth, rulerHeight);

[horizontalRule drawInRect:ruleRect blendMode:kCGBlendModeNormal alpha:1.0];
...