Несовместимый "уровень масштабирования" для класса слоев, выложенного плиткой CA
Поэтому я использую слой CATiled для создания собственного плана этажа. Мой план этажа отлично работает на старых устройствах, таких как 4, 4, 5, 5 и 6. Однако, когда я запускаю свою программу на 6 плюс, моя арифметика для уровня масштабирования отключается. И вот почему: когда я вызываю мой метод рисования прямоугольника, я получаю различную ширину плитки в зависимости от устройства. Когда я вызываю свои изображения, я вызываю их в последовательности ZoomLevel_COL_ROW.image. Мой уровень масштабирования кратен 2. Поэтому каждый раз, когда вы увеличиваете масштаб, мой ZoomLevel вызывается по порядку: 2, 4, 8, 16 и 32. Моя проблема в том, что я не могу понять, как разделить плитки Ширина на 512, чтобы получить мне соответствующий уровень масштабирования. Поэтому на 6 plus моя начальная ширина плитки при загрузке представления составляет 85,53. Таким образом, 512/85.3 дают мне 6 - что не является частью моей последовательности. Тем не менее, на 5 с я получаю ширину плитки 128. Таким образом, 512/128 дает мне 4 - что не входит в мою последовательность, однако пропускает уровень 2. Так что мне трудно определить, какая будет последовательная арифметика, чтобы получить все Последовательности масштабирования каждый раз, когда вы увеличиваете масштаб Напомним, что моя последовательность составляет 2, 4, 8, 16,32. Надеюсь, мне все ясно, и все понимают. Спасибо!
- (void)drawRect:(CGRect)rect
{
// NSLog(@"drawrect %@", NSStringFromCGRect(rect));
zoomLevel = (512 / (CGRectGetWidth(rect)));
int size = 512;
int zoom = 1;
while (size > rect.size.width) {
size /= 2;
zoom ++;
}
NSLog(@"Zoomlevel %d", zoomLevel);
CGSize tileSize = rect.size;
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 tileAtCol:col row:row];
float width = tileSize.width;
float height = tileSize.height;
if (tile.size.width != tile.size.height) {
// make sure that smaller tiles aren't stretched
float widthRatio = tile.size.width / 512;
float heightRatio = tile.size.height / 512;
width *= widthRatio;
height *= heightRatio;
}
CGRect tileRect = CGRectMake(tileSize.width * col,
tileSize.height * row,
width, height);
tileRect = CGRectIntersection(self.bounds, tileRect);
[tile drawInRect:tileRect];
}
}
}
1 ответ
Разобрался почему. Это было связано с масштабным фактором! Потому что iPhone 6 плюс имеет другое разрешение. Проверьте код ниже:
scaleFactor = [UIScreen mainScreen].scale;
float width = rect.size.width;
width *= scaleFactor;
zoomLevel = (512/ width);