【问题标题】:locationInView returns invalid co-ordinates in iOS webviewlocationInView 在 iOS webview 中返回无效坐标
【发布时间】:2013-11-19 06:49:08
【问题描述】:

我正在尝试将签名集成到 pdf 文件中,该文件显示在 UIWebview 中。我可以通过固定位置说(50,50)将签名集成到pdf文件中。现在尝试将其集成到用户的单击位置。首先尝试通过代码获取用户的点击位置,

CGPoint tapLocation = [gesture locationInView: self.view];
NSLog(@"tapped location is %@ \n",NSStringFromCGPoint(tapLocation));
NSInteger x,y;
x=tapLocation.x;
y=tapLocation.y;

CGRect imageRect = CGRectMake(x,y, image.size.width, image.size.height);

我可以获取坐标,但签名没有放在我点击 pdf 文件的位置,然后发现,坐标返回的位置不正确。例如,如果我在位置(50,50)点击它的返回(68,386),那么签名将集成在位置(68,386)。

谁能帮我解决这个问题?

【问题讨论】:

  • 尝试使用 CGPoint tapLocation = [gesture locationInView: self.yourWebview];
  • @PradhyumanChavda,你试过 [gesture locationInView: webview];但结果是一样的。

标签: ios objective-c pdf uiwebview integration


【解决方案1】:

您只需要确保您在 [gesture locationInView: self.view];

就是这样,如果您不确定应该选择哪个视图,请尝试更改代码中的其他子视图。

我可以给你一个猜测,但我需要先看看你的代码。

如果您需要任何帮助,尽管问 (Y)

【讨论】:

  • 是的,我厌倦了另一个子视图 webview 正在发生确切的点击。更改为 [手势 locationInView:webview];但是我仍然无法在精确点击时获得签名,并且获取的坐标与之前的代码相同。
【解决方案2】:

您无法使用 UIWebView 来实现这一点,因为您需要一些您无法获得的信息。
点击位置在视图坐标中给出。为了将此点转换为 PDF 页面坐标,您需要了解以下内容:

  1. 页面在 Web 视图中的显示位置(您不知道)
  2. 用于显示页面的缩放系数(你不知道)
  3. PDF 页面的cropBox/mediaBox(除非重新加载 在 CGPDFDocument 中再次打开页面)

为了将视图坐标正确转换为页面坐标,上述所有信息都是必需的。
下面的代码展示了如何将视点转换为 PDF 点。

- (CGPoint)convertViewPointToPDFPoint:(CGPoint)viewPoint 
{
    CGPoint pdfPoint = CGPointMake(0, 0);

    CGRect cropBox = CGPDFPageGetBoxRect(pdfPage, kCGPDFCropBox);

    int rotation = CGPDFPageGetRotationAngle(pdfPage);

    switch (rotation) {
        case 90:
        case -270:
            pdfPoint.x = cropBox.size.width * (viewPoint.y - pageRenderRect.origin.y) / pageRenderRect.size.height;
            pdfPoint.y = cropBox.size.height * (viewPoint.x - pageRenderRect.origin.x) / pageRenderRect.size.width;
            break;
        case 180:
        case -180:
            pdfPoint.x = cropBox.size.width * (pageRenderRect.size.width - (viewPoint.x - pageRenderRect.origin.x)) / pageRenderRect.size.width;
            pdfPoint.y = cropBox.size.height * (viewPoint.y - pageRenderRect.origin.y) / pageRenderRect.size.height;
            break;
        case -90:
        case 270:
            pdfPoint.x = cropBox.size.width * (pageRenderRect.size.height - (viewPoint.y - pageRenderRect.origin.y)) / pageRenderRect.size.height;
            pdfPoint.y = cropBox.size.height * (pageRenderRect.size.width - (viewPoint.x - pageRenderRect.origin.x)) / pageRenderRect.size.width;
            break;
        case 0:
        default:
            pdfPoint.x = cropBox.size.width * (viewPoint.x - pageRenderRect.origin.x) / pageRenderRect.size.width;
            pdfPoint.y = cropBox.size.height * (pageRenderRect.size.height - (viewPoint.y - pageRenderRect.origin.y)) / pageRenderRect.size.height;
            break;
    }

    pdfPoint.x = pdfPoint.x + cropBox.origin.x;
    pdfPoint.y = pdfPoint.y+ cropBox.origin.y;

    return pdfPoint;
}
  • viewPoint 是您的点击点
  • cropBox 是页面裁剪框(#3)
  • pageRenderRect 是 #1 和 #2 组合(缩放的 PDF 页面在视图坐标中的位置和大小)
  • pdfPoint 是页面上绘制签名的点

以上代码取自article on my blog

【讨论】:

  • 看到贴出的代码后,我有一个疑问,UIView中(0,0)的位置是左上角,而UIWebview中(0,0)的位置是左下角.通过将 UIWebview 的位置更改为左上角的 (0,0) 可以解决此问题。
  • 你能帮我解决这个问题吗?还尝试了以下代码,[webView convertPoint:tapLocation toView:self.window];将点击位置从 webview 转换为视图,并获取此值而不是 (x,y) 但仍然没有将签名放置在点击位置。
  • 正如我所说,您无法使用 UIWebView 正确实现这一点。您需要一个自定义 PDF 查看器。
猜你喜欢
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
相关资源
最近更新 更多