У меня проблема с использованием CATiledLayer ... У меня большое изображение, карта, то есть 4726 x 2701. В принципе мне нужно сломать это изображение на плитки и иметь возможность увеличивать масштаб, чтобы просмотреть множество деталей, но также иметь возможность масштабировать весь путь и видеть всю карту. Используя мою текущую реализацию, она отлично работает, если для увеличения масштаба изображения в scrollview установлено значение 1.0 (максимальная масштабная шкала), но если вы уменьшите масштаб, плитка будет заменена неправильно.Использование CATiledLayer для отображения большого изображения, которое было программно разделено на плитки
Здесь масштабный уровень установлен в 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;
}
Я отображая плитки так же, как Apple, делает в приложении 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
Насколько я понимаю, вам нужно предоставить разные изображения для каждого уровня деталей, и в настоящее время вы используете один и тот же для всех уровней. –