SKTexture и свойство масштабирования UIImage

Есть ли причина, по которой SKTexture появляется, чтобы игнорировать .scale изображения при построении через textureWithImage:?

У меня есть один доступный ресурс изображения, "[email protected]"

Когда я сначала пытаюсь создать текстуру при создании UIImage:

UIImage* image = [UIImage imageNamed:@"retina_image"];
SKTexture* texture_image = [SKTexture textureWithImage:image];
NSLog(@"image size %@, scale %f", NSStringFromCGSize(image.size), image.scale);
NSLog(@"texture from image, size %@", NSStringFromCGSize(texture_image.size));

Получаю следующий результат:

image size {50, 50}, scale 2.000000
texture from image, size {100, 100}

Пока я ожидал получить

image size {50, 50}, scale 2.000000
texture from image, size {50, 50}

Поскольку размер изображения (в точках) равен 50x50
Это также то, что вы получаете, когда напрямую создаете текстуру с ресурсом:

SKTexture* texture_named = [SKTexture textureWithImageNamed:@"retina_image"];
NSLog(@"texture named, size %@", NSStringFromCGSize(texture_named.size));

дает следующий результат (как и ожидалось):

texture named, size {50, 50}

Это говорит о том, что SKTexture игнорирует свойство scale при определении его собственного размера при построении формы изображения при правильном соблюдении масштаба при построении из изображения. Это ожидаемое поведение?

(очевидно, в моем реальном коде я создаю UIImage, который я хочу использовать в текстуре программно, а не через imageNamed)

Изменить: это (подтвержденная) ошибка в SpriteKit, исправленная в iOS8

Ответ 1

Я тоже нашел это и считаю, что это ошибка. Не уверен, как Apple собирается исправить это, поскольку это может сломать существующий код.

Мое обходное решение - прочитать шкалу UIImage, а затем установить масштаб SKSpriteNode 1.0/scale. Это нужно сделать как для x и y шкал SKSpriteNode.

Ответ 2

Из apples doc UIImage

На устройстве под управлением iOS 4 или более поздней версии поведение идентично, если экран устройств имеет масштаб 1,0. Если экран имеет масштаб 2.0, этот метод сначала выполняет поиск для файла изображения с тем же именем файла с добавленным к нему суффиксом @2x. Например, если имя файла, он сначала ищет кнопку @2x. Если он находит 2x, он загружает это изображение и задает свойство scale возвращаемого объекта UIImage до 2.0. В противном случае он загружает немодифицированное имя файла и устанавливает scale до 1.0. См. Руководство по программированию приложений для iOS для получения дополнительной информации. информация о поддержке изображений с различными масштабными коэффициентами.

Но согласно textureWithImageNamed:.

Новый объект текстуры инициализирован с именем файла изображения а затем контроль немедленно возвращается в вашу игру. Комплект поставки Sprite и готовит данные текстуры, когда это необходимо вашей игре.

При загрузке данных текстуры Sprite Kit ищет приложение для файл изображения с указанным именем файла. Если соответствующий файл изображения не может быть найден, Sprite Kit ищет текстуру в любой текстуре атласы, хранящиеся в комплекте приложений. Если указанное изображение не существуют в любом месте пакета, Sprite Kit создает текстуру заполнителя изображение.

Из приведенных выше textureWithImageNamed: и SKTexture не нужно масштабировать устройство (изображение сетчатки).