我有4个可编辑的uitextviews,用户可以设置其字体颜色等。现在我想绘制这些textview的pdf,但使用[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]方法会导致其质量下降,所以我无法使用此方法,而是迭代子视图并以pdf格式绘制文本。现在我的问题是,对于某些文本视图,文本在pdf中正确打印,但对于其他文本视图,文本不是在正确的位置绘制的。这是我从textview中绘制pdf的代码。 NSArray * arrayOfsubviews = [self.view subviews];
for (int i=0; i<[arrayOfsubviews count]; i++) {
if ([[arrayOfsubviews objectAtIndex:i]isKindOfClass:[UITextView class]]) {
UITextView *texts=[arrayOfsubviews objectAtIndex:i];
CTFontRef ctFont = CTFontCreateWithName((__bridge CFStringRef)texts.font.fontName, texts.font.pointSize,NULL);
CGColorRef color = texts.textColor.CGColor;
NSDictionary *attributesDict = [NSDictionary dictionaryWithObjectsAndKeys:
(__bridge id)ctFont, (id)kCTFontAttributeName,
color, (id)kCTForegroundColorAttributeName,nil];
NSAttributedString *stringToDraw = [[NSAttributedString alloc] initWithString:texts.text
attributes:attributesDict];
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef) stringToDraw);
CGRect rect=CGRectMake(texts.frame.origin.x,916-texts.frame.origin.y-texts.frame.size.height, texts.frame.size.width, texts.frame.size.height);
CGMutablePathRef pathRef = CGPathCreateMutable();
CGPathAddRect(pathRef, NULL,rect);
CTFrameRef frameRef = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0),pathRef, NULL);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
CGContextTranslateCTM(context, 0,916);
CGContextScaleCTM(context, 1.0, -1.0);
CTFrameDraw(frameRef, context);
CGContextRestoreGState(context);
CGPathRelease(pathRef);
}
}
UIGraphicsEndPDFContext();
答案 0 :(得分:4)
我用它来绘制我的文字,效果相当好......也许它可以指出你正确的方向。
#define kBorderInset 20.0
#define kMarginInset 10.0
- (void) drawText{
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(currentContext, 0.0, 0.0, 0.0, 1.0);
NSString *textToDraw = @"Your Text Here";
UIFont *font = [UIFont systemFontOfSize:14.0];
CGSize stringSize = [textToDraw sizeWithFont:font
constrainedToSize:CGSizeMake(pageSize.width - 2*kBorderInset-2*kMarginInset, pageSize.height - 2*kBorderInset - 2*kMarginInset)
lineBreakMode:UILineBreakModeWordWrap];
CGRect renderingRect = CGRectMake(kBorderInset + kMarginInset, kBorderInset + kMarginInset + 350.0, pageSize.width - 2*kBorderInset - 2*kMarginInset, stringSize.height);
[textToDraw drawInRect:renderingRect
withFont:font
lineBreakMode:UILineBreakModeWordWrap
alignment:UITextAlignmentLeft];
}
答案 1 :(得分:1)
您想使用drawInContext:而不是renderInContext:。 renderInContext将栅格化文本,drawInContext将其编码为可编辑,与分辨率无关的文本。
答案 2 :(得分:0)
由于框架的原因,一些质量或模糊视图的缺失。用于在屏幕中定位帧的值是CGFloat,因此你可以在点(0.5,5.7)中有一个帧,显然这没有任何意义,point.x必须是0或1.十进制值混淆操作系统,因此建议确保帧始终没有十进制数值。
您可以在此处获取更多信息:http://www.cobiinteractive.com/blog/2011/06/objective-c-blurry-uiview/或此处:http://www.markj.net/iphone-uiview-blurred-blurry-view/