SKTexture и свойство масштаба UIImage
Есть ли какая-либо причина, по которой SKTexture
, по-видимому, игнорирует .scale
изображения, построенного с помощью textureWithImage:
?
У меня есть один доступный ресурс изображений, "retina_image@2x.png"
Когда я пытаюсь создать текстуру при создании 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 при определении собственного размера при построении изображения, в то же время должным образом соблюдая масштаб при построении из imagename.
Является ли это ожидаемым поведением?
(очевидно, в моем реальном коде я создаю UIImage, который хочу использовать в текстуре программно, а не через ImageName)
Edit: это (подтвержденная) ошибка в SpriteKit, исправлена в iOS8
3 ответа:
Я тоже нашел это и считаю, что это ошибка. Не знаю, как Apple собирается исправить это, поскольку это может сломать существующий код.
Мой обходной путь состоит в том, чтобы прочитать масштаб UIImage и затем установить масштаб SKSpriteNode равным 1.0 / scale. Это необходимо сделать как для X, так и для y масштабов SKSpriteNode.
Из яблок доков
UIImage
На устройстве, работающем под управлением iOS 4 или более поздней версии , поведение идентично, если экран устройства имеет масштаб 1,0. Если экран имеет масштаб 2,0 , этот метод сначала ищет файл изображения с тем же именем с суффиксом @2x, добавленным к нему . Например, если имя файла кнопка, он сначала ищет кнопку@2x. если он находит 2x, он загружает это изображение и задает свойство масштаба возвращенный объект UIImage до 2.0. В противном случае он загружает неизмененное имя файла и устанавливает масштабируйте свойство до 1.0. Дополнительную информацию смотрите в руководстве по программированию приложений iOS информация о вспомогательных изображениях с различными масштабными коэффициентами.
Но согласно
textureWithImageNamed:
.Новый текстурный объект инициализируется именем файла изображения и тогдаконтроль немедленно возвращается в вашу игру. Набор спрайтов загружается и подготавливает текстурные данные, когда это необходимо ваша игра.
При загрузке текстурных данных Sprite Kit ищет пакет приложений для файл изображения с указанным именем . Если соответствующий файл изображения не удается найти, Sprite Kit ищет текстуру в любой текстуре атласы, хранящиеся в пакете приложений. Если указанное изображение не соответствует существуя в любом месте пакета, Sprite Kit создает текстуру-заполнитель изображение.
Из приведенного выше
textureWithImageNamed:
иSKTexture
не заботится о масштабировании с помощью устройство.(изображение сетчатки).
У меня такое же поведение с текстурами из атласа, созданными из словаря. На iOS 8.3
Как заставить SKTextureAtlas, созданный из словаря, не изменять размер текстур?