2013-01-18 57 views
1

我遇到了使用CATiledLayer的問題...我有一個大的圖像,一個地圖,它是4726 x 2701.基本上我需要將這張圖片分解爲圖塊並能夠放大查看大量細節,同時也能夠縮小圖像並查看整個地圖。使用我當前的實現,如果scrollview的縮放級別設置爲1.0(最大縮放比例),它會很好地工作,但如果縮小了tile,則會被錯誤地替換。使用CATiledLayer顯示一個已被編程劃分成瓷磚的大圖像

這裏zoomlevel設置爲1.0。地圖看起來很完美。 enter image description here

但是,如果zoomlevel完全出來(0.2我相信)地圖都搞砸了。我應該看到整個地圖不只是兩個瓷磚。

enter image description here

這裏是我如何從大圖像獲取磚:

- (UIImage *)tileForScale:(CGFloat)scale row:(int)row col:(int)col { 
    float tileSize = 256.0f; 
    CGRect subRect = CGRectMake(col*tileSize, row * tileSize, tileSize, tileSize); 
    CGImageRef tiledImage = CGImageCreateWithImageInRect([mapImage CGImage], subRect); 
    UIImage *tileImage = [UIImage imageWithCGImage: tiledImage]; 
    return tileImage; 
} 

我顯示磚酷似蘋果在PhotoScroller應用程序做。

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGFloat scale = CGContextGetCTM(context).a; 

    CATiledLayer *tiledLayer = (CATiledLayer *)[self layer]; 
    CGSize tileSize = tiledLayer.tileSize; 
    tileSize.width /= scale; 
    tileSize.height /= scale; 

    int firstCol = floorf(CGRectGetMinX(rect)/tileSize.width); 
    int lastCol = floorf((CGRectGetMaxX(rect)-1)/tileSize.width); 
    int firstRow = floorf(CGRectGetMinY(rect)/tileSize.height); 
    int lastRow = floorf((CGRectGetMaxY(rect)-1)/tileSize.height); 

    for (int row = firstRow; row <= lastRow; row++) { 
     for (int col = firstCol; col <= lastCol; col++) { 
      UIImage *tile = [self tileForScale:scale row:row col:col]; 
      CGRect tileRect = CGRectMake(tileSize.width * col, tileSize.height * row, 
            tileSize.width, tileSize.height); 
      tileRect = CGRectIntersection(self.bounds, tileRect); 

      [tile drawInRect:tileRect]; 
     } 
    } 
} 

而且,這裏是我設置的細節水平的代碼,這對於我的形象返回4:

- (id)initWithImageName:(NSString *)name andImage:(UIImage*)image size:(CGSize)size { 
    self = [super initWithFrame:CGRectMake(0, 0, size.width, size.height)]; 
    if (self) { 
     _imageName = [name retain]; 
     mapImage = [image retain]; 

     CATiledLayer *tiledLayer = (CATiledLayer *)[self layer]; 
     tiledLayer.levelsOfDetail = [self zoomLevelsForSize:mapImage.size]; 
    } 
    return self; 
} 
- (NSUInteger)zoomLevelsForSize:(CGSize)imageSize { 
    int zLevels = 1; 
    while(YES) { 
     imageSize.width /= 2.0f; 
     imageSize.height /= 2.0f; 
     if(imageSize.height < 256.0 || imageSize.width < 256.0) break; 
     ++zLevels; 
    } 
    return zLevels; 
} 

我假設它有事情做與瓷磚大小和縮放比例,但我真的不知道如何解決這個問題。我似乎無法在Google上找到解決我的問題的任何解決方案。任何幫助將是偉大的! :)

+1

你的平鋪層的'levelsOfDetail'屬性的值是多少?您對所有比例使用相同的源圖像,因此應將'levelsOfDetail'設置爲1 –

+0

我更新了問題以反映詳細程度。 – Homeschooldev

+0

據我瞭解,您需要爲每個細節級別提供不同的圖像,並且您目前對所有級別都使用相同的圖像。 –

回答

1

您在 - (UIImage *)tileForScale:(CGFloat)縮放行中有泄漏:(int)row col:(int)col。我們可以看到,CGImageRef tiledImage = CGImageCreateWithImageInRect([mapImage CGImage],subRect);不要忘記釋放CGImageRef:CGImageRelease(tiledImage);不要忘記釋放CGImageRef:CGImageRelease(tiledImage);不要忘記釋放CGImageRef:CGImageRelease(tiledImage);不要忘記釋放CGImageRef。

0

我認爲有一個錯誤,在示例代碼中錯誤地設置了比例。 我有以下幾種:

CGFloat scale = CGContextGetCTM(context).a; 
scale = 1.0f/roundf(1.0f/scale); 
if (scale == INFINITY) { 
    scale = 1.0f; 
}