2

我有兴趣打印一些不属于视图层次结构的 MKMapView,并且仅在用户点击打印时创建。

似乎以下情况是正确的:

  1. 屏幕外的 MKMapViews 根本不渲染。
  2. 打印 MKMapView 会打印出它呈现的内容,但它目前是这样的。

所以似乎要打印我的地图视图,我需要将它们放入视图层次结构中。幸运的是,从实验来看,我似乎可以在屏幕上将一堆地图视图并排放置,它们仍然会渲染。

我的主要问题是我怎么知道他们已经渲染了?如果我在将地图视图放入视图层次结构后立即触发打印命令,它们将打印部分渲染,缺少位,如下所示。我想等到他们完成加载,然后运行打印作业。(如果他们可以在屏幕上显示打印表时在后台加载,那就更好了,然后我只是在用户点击打印后给用户一个进度条,直到地图完成加载。)

(下图显示了打印部分加载的地图视图时会发生什么。)

打印

我的第二个问题是:有没有更好的方法来打印多个地图视图?将所有内容都放入视图层次结构并不是很好——它限制了我可以使用的最大大小,这意味着我有很多笨拙的代码来处理子视图。

4

2 回答 2

2

您应该在地图视图上设置一个委托(MKMapViewDelegate)并实现mapViewDidFinishLoadingMap:,它将在地图视图完成加载必要的图块时调用。

于 2013-02-01T10:27:49.300 回答
0

当地图视图不一定在屏幕上可见时,我在将 MKMapView 渲染到图像时遇到了类似的问题。我发现以下解决方案对我有用。我希望这可以帮助别人。基本上,它确保地图有一个窗口。在 ios6.0 中,您需要给它一个窗口以使其加载地图,然后在完成加载时,您在渲染之前等待一段时间以使图块有机会加载。在 ios 5.0 中,您无需等待 didfinishload,您只需确保地图在渲染功能中有一个窗口并且图块可见。

{
      if ([@"5.9.9" compare:[UIDevice currentDevice].systemVersion options:NSNumericSearch] == NSOrderedAscending) {
          // actualVersion is lower than the requiredVersion 
          self.oldSuperview = nil;
          if (self.map.window == nil) {
        self.oldSuperview = self.map.superview;
              [[[[UIApplication sharedApplication] delegate] window] insertSubview:self.map atIndex:0];
          }
      } else { 
         [self performSelector:@selector(renderMap) withObject:nil afterDelay:0.10];
     }

}

-(void) renderMap {

    //map will only render tiles if it has a window, so we need to add it to
    //the main window if it does not have a window.

    if ([@"5.9.9" compare:[UIDevice currentDevice].systemVersion options:NSNumericSearch] != NSOrderedAscending) {
        if (self.map.window == nil) {
            self.oldSuperview = self.map.superview;
            [[[[UIApplication sharedApplication] delegate] window] addSubview:self.map];
        }
    }


    // Generate the image centred
    UIGraphicsBeginImageContextWithOptions(self.map.bounds.size, NO, 0.0);

    [self.map.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();


    // Save the image here


    if ([@"5.9.9" compare:[UIDevice currentDevice].systemVersion options:NSNumericSearch] != NSOrderedAscending) {

        if (self.oldSuperview) {
            [self.map removeFromSuperview];
            [self.oldSuperview addSubview:self.map];
            self.oldSuperview = nil;
        }

    }

}

}



-(void) cleanMap {
      if (self.map.superview == [[[UIApplication sharedApplication] delegate] window]) {

          if (oldSuperview) { 
              [oldSuperview addSubview:self.map];
              self.oldSuperview = nil;
          }
      }
 }
 -(void) mapViewDidFinishLoadingMap:(MKMapView *)mapView {

if ([@"5.9.9" compare:[UIDevice currentDevice].systemVersion options:NSNumericSearch] == NSOrderedAscending) { 
    if (oldSuperview) {

        [self performSelector:@selector(renderMap) withObject:nil afterDelay:1.10];
        [self performSelector:@selector(cleanMap) withObject:nil afterDelay:1.41];
    } else {
        [self renderMap];
    }
} else {
    [self renderMap];
}

 }
于 2013-02-27T04:47:20.877 回答