2

ビュー階層の一部ではなく、ユーザーが[印刷]をクリックしたときにのみ作成されるいくつかのMKMapViewを印刷することに興味があります。

次のことが当てはまるようです。

  1. オフスクリーンMKMapViewsはまったくレンダリングされません。
  2. MKMapViewを印刷すると、現在の状態でレンダリングされた状態で印刷されます。

したがって、マップビューを印刷するには、それらをビュー階層に入れる必要があるようです。幸いなことに、実験から、画面上で多数のマップビューを前面に配置でき、それらは引き続きレンダリングされるようです。

私の主な質問は、彼らがレンダリングしたことをどうやって知るのですか?マップビューをビュー階層に配置した直後にprintコマンドを実行すると、以下に示すように、ビットが欠落した状態で部分的にレンダリングされて印刷されます。ロードが完了するまで待ってから、印刷ジョブを実行したいと思います。(印刷シートが画面に表示されているときにバックグラウンドでロードできる場合はさらに良いです。その後、ユーザーが[印刷]をクリックした後、マップのロードが完了するまで、プログレスバーをユーザーに表示します。)

(下:部分的にロードされたマップビューを印刷するとどうなるかを示す画像。)

プリントアウト

私の2番目の質問は、複数のマップビューを印刷するためのより良い方法はありますか?すべてをビュー階層に入れるのは素晴らしいことではありません。使用できる最大サイズが制限され、サブビューを調整するための厄介なコードがたくさんあることを意味します。

4

2 に答える 2

2

マップ ビューにデリゲート ( MKMapViewDelegate ) を設定し、 mapViewDidFinishLoadingMap:を実装する必要があります。これは、マップ ビューが必要なタイルの読み込みを完了したときに呼び出されます。

于 2013-02-01T10:27:49.300 に答える
0

マップ ビューが必ずしも画面に表示されない場合、MKMapView を画像にレンダリングする際に同様の問題が発生しました。次の解決策がうまくいったことがわかりました。これが誰かに役立つことを願っています。基本的に、マップにウィンドウがあることを確認します。iOS 6.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 に答える