将多个 UIWebViews 作为 UIImages 写入 PDF 文件

Posted

技术标签:

【中文标题】将多个 UIWebViews 作为 UIImages 写入 PDF 文件【英文标题】:Writing multiple UIWebViews as UIImages to PDF file 【发布时间】:2017-03-18 20:10:18 【问题描述】:

我正在使用图表创建库 TWRCharts(它是 UIWebView 的一个子类)将多个图表绘制到一个 PDF 文件中,但我无法在我的 PDF 文件中添加多个图表。

我使用以下代码来调用我的图表创建方法:

- (void)viewDidLoad 
    [super viewDidLoad];

    [self createTapImageFromChart];
    [self createCogImageFromChart];

这些是被调用的方法(部分):

- (void)createTapImageFromChart 

    // Chart View
    _chartViewTap = [[TWRChartView alloc] initWithFrame:CGRectMake(0, 0, 400, 300)];
    _chartViewTap.backgroundColor = [UIColor clearColor];

    // Hide the chartview until needed
    _chartViewTap.hidden = YES;

    // Add the chart view to the controller's view
    [self.view addSubview:_chartViewTap];


- (void)createCogImageFromChart 

    // Chart View
    _chartViewCog = [[TWRChartView alloc] initWithFrame:CGRectMake(0, 0, 400, 300)];
    _chartViewCog.backgroundColor = [UIColor clearColor];

    // Hide the chartview until needed
    _chartViewCog.hidden = YES;

    // Add the chart view to the controller's view
    [self.view addSubview:_chartViewCog];

那么我用来捕获图表并将它们绘制到 PDF 文件的代码是:

//////////// Capture Tap Chart ///////////////

_chartViewTap.hidden = NO;
UIGraphicsBeginImageContext(_chartViewTap.bounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();
UIGraphicsPushContext(context);
[_chartViewTap.layer renderInContext:context];
UIGraphicsPopContext();
self.chartImageTap = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
_chartViewTap.hidden = YES;

///////////// End Capture Tap Chart //////////

UIImage *anImage = self.chartImageTap;
CGRect tapHeader = [self addText:@"Finger Tap Test"
                            withFrame:CGRectMake(kPadding, blueLineRect.origin.y + blueLineRect.size.height + kPadding, _pageSize.width - kPadding*2, 4) fontSize:18.0f];
CGRect imageRect = [self addImage:anImage
                          atPoint:CGPointMake(/*(_pageSize.width/2)-(anImage.size.width/2)*/ kPadding, tapHeader.origin.y + tapHeader.size.height + kPadding)];

//////////// Capture Cog Chart ///////////////

_chartViewCog.hidden = NO;
UIGraphicsBeginImageContext(_chartViewCog.bounds.size);
CGContextRef contextCog = UIGraphicsGetCurrentContext();
UIGraphicsPushContext(contextCog);
[_chartViewCog.layer renderInContext:contextCog];
UIGraphicsPopContext();
self.chartImageCog = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
_chartViewCog.hidden = YES;

///////////// End Capture Cog Chart //////////

UIImage *anImageCog = self.chartImageCog;
CGRect cogHeader = [self addText:@"Cognitive Test"
                       withFrame:CGRectMake(420, blueLineRect.origin.y + blueLineRect.size.height + kPadding, _pageSize.width - kPadding*2, 4) fontSize:18.0f];
CGRect imageRectCog = [self addImage:anImageCog
                          atPoint:CGPointMake(420, blueLineRect.origin.y + blueLineRect.size.height + kPadding)];

当我运行它并保存 PDF 时,我得到了这个:

但是当我注释掉 [self createTapImageFromChart];和“捕获抽头图表”部分,我在 PDF 中得到了这个:

我需要两个图表同时并排显示。我计划在下面再添加两个图表,也是并排的。有人可以提供有关如何解决此问题的建议/代码吗?我相信问题出在我的上下文中。我只是不确定如何制作,以便在打印第一个图表时不会省略第二个图表。

【问题讨论】:

你能澄清一下“解决这个问题”在这种情况下的含义吗?您是否关心红线的垂直定位?认知图表与其标签的重叠?第一张图片中缺少的认知测试? 很抱歉不清楚。我希望两个图表同时出现。想象第一张图片,但第二张图片中的图表也在 PDF 上。我最终还将在这些图表下方添加两个图表。我认为这与我的图像上下文有关,但不确定。 方法-addImage:atPoint:从何而来?这是您自己的,还是在 PDF 或图表处理库中? 【参考方案1】:

尝试添加修改添加为子视图的图表视图的位置。例如。

_chartViewTap = [[TWRChartView alloc] initWithFrame:CGRectMake(0, 0, 400, 300)];
_chartViewCog = [[TWRChartView alloc] initWithFrame:CGRectMake(410, 0, 400, 300)];

【讨论】:

以上是关于将多个 UIWebViews 作为 UIImages 写入 PDF 文件的主要内容,如果未能解决你的问题,请参考以下文章

iphone: UIwebview 卷曲效果

将一个 VNCoreMLFeatureValueObservation 结果(3D 双精度数组)转换为多个 UIImage

自动布局:使用 UIWebViews 自定义 UIView 高度约束

我可以将 UIImage 作为文本放在 textview 中,以便我可以在 ios 中将它们作为文本删除

将 UIImage 视图作为子视图添加到 UIView 的实例

具有多个 CDVViewController 的 Phonegap/Cordova