UIGraphicsEndPDFContext(); терпит неудачу с японским NSAttributedText
Кто-нибудь сталкивался с ошибкой Xcode в UIGraphicsEndPDFContext() после рисования в контексте с японским текстом из NSAttributedString? К счастью, когда я впервые тестировал свой код на японском языке, мой iPhone был в автономном режиме, и он работал. Однако гораздо позже, когда я запустил тот же код в симуляторе, он потерпел неудачу, и я потратил много времени, пытаясь его отладить. Он также потерпит неудачу при попытке запустить его из Xcode на iPhone или iPad, если он подключен к Mac. Похоже, попытка запустить из Xcode на японском языке, таким образом, является проблемой. Mac был установлен на английский.
Ниже приведен метод, который я использовал для рисования. Он тесно основан на примере, опубликованном Эрикой Садун в ее книге "Поваренная книга для iOS 5 для разработчиков", которая была для меня хорошей книгой. Он помещается после последовательности UIGraphicsBeginPDFContextToData() и UIGraphicsBeginPDFPageWithInfo() и перед вызовом UIGraphicsEndPDFContext(), который отлично работает на английском языке. Мне не обязательно это исправлять. Я просто хотел предупредить других, чтобы они могли избежать двух дней, которые я потратил, пытаясь разобраться в этой проблеме.
- (void)drawText:(NSAttributedString *)textToDraw inFrame:(CGRect)frameRect bkgColor:(UIColor *)backgroundColor {
CFAttributedStringRef currentText = (__bridge CFAttributedStringRef)(textToDraw);
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(currentText);
// Draw background when a color is set
if (backgroundColor) {
[backgroundColor set];
CGRect backgroundFrame = CGRectMake(frameRect.origin.x, frameRect.origin.y -backgroundOffset, frameRect.size.width, frameRect.size.height -3);
//CGRect backgroundFrame = CGRectMake(frameRect.origin.x, frameRect.origin.y -2, frameRect.size.width, frameRect.size.height -3);
CGContextFillRect( UIGraphicsGetCurrentContext(), backgroundFrame);
[[UIColor whiteColor] set];
}
CGMutablePathRef framePath = CGPathCreateMutable();
CGPathAddRect(framePath, NULL, frameRect);
// Get the frame that will do the rendering.
CFRange currentRange = CFRangeMake(0, 0);
CTFrameRef frameRef = CTFramesetterCreateFrame(framesetter, currentRange, framePath, NULL);
CGPathRelease(framePath);
// Get the graphics context.
CGContextRef currentContext = UIGraphicsGetCurrentContext();
// Put the text matrix into a known state so no old scaling factors are left in place.
CGContextSetTextMatrix(currentContext, CGAffineTransformIdentity);
int adjust = frameRect.origin.y * 2 + frameRect.size.height;
// Core Text draws from the bottom-left corner up, so flip
// the current transform prior to drawing.
CGContextTranslateCTM(currentContext, 0, adjust);
CGContextScaleCTM(currentContext, 1.0, -1.0);
// Draw the frame.
CTFrameDraw(frameRef, currentContext);
CGContextScaleCTM(currentContext, 1.0, -1.0);
CGContextTranslateCTM(currentContext, 0, (-1)*adjust);
CFRelease(frameRef);
CFRelease(framesetter);
backgroundColor = nil;
}