0

CATiledLayer に裏打ちされた UIScrollView があります。レイヤーはサーバーからタイルを取得し、drawLayer:inContextが呼び出されたときに要求された内容に応じてタイルを表示します。外観は次のとおりです。

-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{
    ASIHTTPRequest *mapRequest;
    WMSServer *root = self.mapLayer.parentServer;
    while(root == nil){
        root = self.mapLayer.parentLayer.parentServer;
    }
    //Get where we're drawing
    CGRect clipBox = CGContextGetClipBoundingBox(ctx);
    double minX = CGRectGetMaxY(clipBox);
    double minY = CGRectGetMinX(clipBox);
    double maxX = CGRectGetMinY(clipBox);
    double maxY = CGRectGetMaxX(clipBox);

    //URL for the request made here using the min/max values from above
    NSURL *url = [[NSURL alloc] initWithString:path];
    mapRequest = [ASIHTTPRequest requestWithURL:url];
    [url release];
    [mapRequest startSynchronous];
    //Wait for it to come back...
    //Turn the Data into an image
    NSData *response = [mapRequest responseData];
    //Create the entire image
    CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((CFDataRef)response);
    CGImageRef image = CGImageCreateWithPNGDataProvider(dataProvider, NULL, true, kCGRenderingIntentDefault);
    CGDataProviderRelease(dataProvider);
    //Now paint the PNG on the context
    CGContextDrawImage(ctx, clipBox, image);
}

ズームインすると問題が発生します。タイルのサイズ (clipBox長方形で示されている) が小さくなり、たとえば 32 x 32 ピクセルの場合、URL は 32 ピクセルに対して適切に形成されますが、画面に表示されるものはスケーリングされます。最大でデフォルトの tileSize (この場合は 128 x 128 ピクセル)。これらの画像を適切に描画するレイヤーを取得する方法はありますか。

4

1 に答える 1

0

それを見つけた。で を取得しCGAffineTransform、(または) プロパティCGContextGetCTM(CGContextRef)の値をズームとして使用します。適切にズームされた画面解像度で画像を取得します(高さと幅にズームを掛けます)。次に、その画像をクリップ ボックスに描画します。ab

于 2010-06-08T14:50:50.043 に答える