我遇到了使用CATiledLayer的問題...我有一個大的圖像,一個地圖,它是4726 x 2701.基本上我需要將這張圖片分解爲圖塊並能夠放大查看大量細節,同時也能夠縮小圖像並查看整個地圖。使用我當前的實現,如果scrollview的縮放級別設置爲1.0(最大縮放比例),它會很好地工作,但如果縮小了tile,則會被錯誤地替換。使用CATiledLayer顯示一個已被編程劃分成瓷磚的大圖像
這裏zoomlevel設置爲1.0。地圖看起來很完美。
但是,如果zoomlevel完全出來(0.2我相信)地圖都搞砸了。我應該看到整個地圖不只是兩個瓷磚。
這裏是我如何從大圖像獲取磚:
- (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上找到解決我的問題的任何解決方案。任何幫助將是偉大的! :)
你的平鋪層的'levelsOfDetail'屬性的值是多少?您對所有比例使用相同的源圖像,因此應將'levelsOfDetail'設置爲1 –
我更新了問題以反映詳細程度。 – Homeschooldev
據我瞭解,您需要爲每個細節級別提供不同的圖像,並且您目前對所有級別都使用相同的圖像。 –