如何将UIView转换为具有字母和图像旋转状态的PDF?

时间:2013-10-21 06:33:09

标签: ios objective-c pdf uiview uiimageview

我发现这个ViewToPDF(https://github.com/devgeek27/ViewToPDF)用UIView创建PDF文件,带有漂亮的矢量文本。问题是当我旋转UILabel和UIImageview时,那些标签和图像不会在PDF上旋转。你如何保存这些的旋转状态?

-(void)renderSubviewsOfView:(UIView*)parentView {
NSArray *subviews = [parentView subviews];
if ([subviews count] == 0) return;

for (UIView *view in subviews)
{
    CGRect drawFrame = view.frame;
    if(parentView != viewToRender)
    {
        drawFrame = CGRectMake(view.frame.origin.x+parentView.frame.origin.x, view.frame.origin.y+parentView.frame.origin.y, view.frame.size.width, view.frame.size.height);
    }

    if([view isKindOfClass:[UILabel class]])
    {
        UILabel *label = (UILabel*)view;

        if(label.backgroundColor != [UIColor clearColor] && label.backgroundColor != nil)
        {
            [self drawAndFillRect:drawFrame andFillWithColor:label.backgroundColor];
        }
        drawFrame = CGRectMake(label.frame.origin.x, label.frame.origin.y+label.frame.size.height, label.frame.size.width, label.frame.size.height);
        [self drawText:label.text inFrame:drawFrame withFont:label.font andColor:label.textColor andTextAlignment:label.textAlignment];
    }
    else if([view isKindOfClass:[UIImageView class]])
    {
        UIImageView *imgView = (UIImageView*)view;
        if(imgView.image != nil)
        {
            [self drawImage:imgView.image inRect:drawFrame];
        }
        else if(imgView.backgroundColor != [UIColor clearColor] && imgView.backgroundColor != nil)
        {
            [self drawAndFillRect:drawFrame andFillWithColor:imgView.backgroundColor];
        }
    }
    else if([view isKindOfClass:[UIView class]])
    {
        if(view.backgroundColor != [UIColor clearColor] && view.backgroundColor != nil)
        {
            [self drawAndFillRect:drawFrame andFillWithColor:view.backgroundColor];
        }
    }
    [self renderSubviewsOfView:view];
}     
}

#pragma mark Drawing Methods

- (void)drawText:(NSString *)textToDraw inFrame:(CGRect)frameRect withFont:(UIFont )labelFont andColor:(UIColor )color andTextAlignment:(UITextAlignment)alignment  {

CGSize stringsize = [textToDraw sizeWithFont:labelFont];
if(alignment == UITextAlignmentCenter)
{
    frameRect = CGRectMake(frameRect.origin.x+((frameRect.size.width - stringsize.width)/2), frameRect.origin.y, stringsize.width, frameRect.size.height);
}
else if(alignment == UITextAlignmentRight)
{
    frameRect = CGRectMake(frameRect.origin.x+(frameRect.origin.x-stringsize.width), frameRect.origin.y, stringsize.width, frameRect.size.height);
}

frameRect = CGRectMake(frameRect.origin.x, frameRect.origin.y+((frameRect.size.height - stringsize.height)/2), frameRect.size.width, stringsize.height);

int length=[textToDraw length];
CFStringRef string = (__bridge CFStringRef) textToDraw;
CFMutableAttributedStringRef currentText = CFAttributedStringCreateMutable(kCFAllocatorDefault, 0);

CFAttributedStringReplaceString (currentText,CFRangeMake(0, 0), string);
CFAttributedStringSetAttribute(currentText, CFRangeMake(0, length), kCTForegroundColorAttributeName, color.CGColor);
CTFontRef font = CTFontCreateWithName((__bridge CFStringRef)labelFont.fontName, labelFont.pointSize, nil);
CFAttributedStringSetAttribute(currentText,CFRangeMake(0, length),kCTFontAttributeName,font);

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(currentText);

CGMutablePathRef framePath = CGPathCreateMutable();
CGPathAddRect(framePath, NULL, frameRect);
CFRange currentRange = CFRangeMake(0, 0);
CTFrameRef frameRef = CTFramesetterCreateFrame(framesetter, currentRange, framePath, NULL);
CGPathRelease(framePath);
CGContextRef    currentContext = UIGraphicsGetCurrentContext();
CGContextSetTextMatrix(currentContext, CGAffineTransformIdentity);
CGContextTranslateCTM(currentContext, 0, frameRect.origin.y*2);
CGContextScaleCTM(currentContext, 1.0, -1.0);
CTFrameDraw(frameRef, currentContext);
CGContextScaleCTM(currentContext, 1.0, -1.0);
CGContextTranslateCTM(currentContext, 0, (-1)*frameRect.origin.y*2);
CFRelease(frameRef);
CFRelease(framesetter);

}

0 个答案:

没有答案