2015-12-05 5 views
0

Мне нужно отобразить несколько изображений в приложении IOS. Что делать, чтобы изображения отображались на всех устройствах надлежащим образом?Отображение изображений в приложении iOS

Должен ли я устанавливать размер изображения вручную на основе устройства? Просьба уточнить.

ответ

2

Вы не использовали SpriteKit только для отображения изображений. Вы загрузите изображения как UIImage, а затем создайте UIImageView, которые вы можете разместить на экране везде, где бы вы ни захотели, а затем просто назначьте UIImageViewUIImage. UIImageView обладает множеством свойств, которые вы можете установить, как отображаются изображения (например, если они масштабированы и как они масштабируются, или если они не масштабируются, как они должны быть выровнены в пределах области видимости и т. Д.). Вы можете нарисовать UIImageView поверх сцены SpriteKit, что не проблема в iOS (на iOS все рисуется OpenGL ES или Metal в любом случае).

Конечно, вы можете также вставлять любое изображение в качестве спрайта, если вам нравится:

UIImages * img = ...; 
SKTexture * tex = [SKTexture textureWithImage:img]; 
SKSpriteNode * sprite = [[SKSpriteNode alloc] initWithTexture:tex]; 
// If you don't use ARC, I'd add the following below: 
// [sprite autorelease]; 

Теперь вы можете полностью интегрировать его в сцену в какой бы путь вы, как идеально выровнять это будет все другие спрайты. Тем не менее, если вы просто хотите, чтобы нарисовать изображение на сцене:

SKScene * scene = ...; 
SKView * sceneView = scene.view; 

UIImageView * imgView = [[UIImageView alloc] init]; 
imgView.image = img; 
// Whatever content mode you prefer 
imgView.contentMode = UIViewContentModeScaleAspectFit; 
// Where shall it be placed and how big shall it be. 
imgView.frame = CGRectMake(posX, posY, width, height); 
// If you'd use this, it will cover the whole scene: 
// imgView.frame = sceneView.frame; 

// Add it on top of your scene 
[[sceneView parent] addSubview:imgView]; 

// If you don't use ARC, don't forget to release it: 
// [imgView release]; 

Если вы загружаете UIImage из вашего пакета приложения с [UIImage imageNamed:@"blah"] и изображением существует в разных разрешениях для сетчатки устройств (blah.png, [email protected], [email protected]), то система автоматически загрузит изображение, которое оно считает наиболее подходящим для экрана текущего устройства. Это ничего, с чем вам приходится иметь дело.

Если вам необходимо конвертировать между координатами сцены и координатами просмотра, SKScene предлагает -convertPointFromView: и -convertPointToView: для этого случая. Если сцена заполняет весь экран, они фактически преобразуются между координатами сцены и экрана.

Даже если устройства имеют разные разрешения, ваша сцена всегда может иметь один и тот же «виртуальный размер». Поэтому вы всегда можете сказать, что сцена составляет 400x300, независимо от того, что такое реальное разрешение экрана. В этом случае размещение спрайта виртуального размера 200x150 в виртуальных координатах (100,75) всегда будет центрировать его на экране, независимо от того, какое устройство или насколько большой экран на самом деле (ну, полагая, что SKSceneView действительно охватывает точно все screne, конечно). Размер SKScene - это всего лишь система координат, которую вы хотите иметь для компоновки вашей игры, она может быть тем, чем вы хотите, она может быть больше или меньше реального экрана.

Сцена всегда втягивается в SKSceneView. Размер SKSceneView - это реальный размер вашей сцены в координатах экрана. Итак, если вы SKScene 480x320, а размер SKSceneView - 1440x960, то перемещение спрайта на один пиксель в вашей сцене фактически переместит его на 3 пикселя на экране. Тем не менее, если ваш SKScene - 1136x640, но ваш SKSceneView составляет всего 586x320, тогда перемещение спрайта на два пикселя в вашей сцене будет перемещать только один пиксель на экране. Ваша сцене всегда увеличивается или уменьшается по мере необходимости.

Лично я либо придерживаюсь одинакового размера на всех устройствах, либо просто делаю два или три класса устройств, но не принимаю игру для каждого отдельного устройства и любого существующего разрешения экрана.

+0

В игре, которую я разрабатываю с помощью Spritekit, вы бы порекомендовали мне использовать UIImage/UIImageView? –

+0

@adf_mobile_developer Зависит от того, как вы хотите отображать изображения. Полный экран на весь экран или встроенный в контент игры? – Mecki

+0

встроен в контент игры. не весь экран. –

2

Есть много вещей, которые следует учитывать при работе с изображениями в SpriteKit. Короткий ответ: вы должны создавать изображения в 1x, 2x и 3x (background.png, [email protected]x.png и [email protected]). Если вы это сделаете, вы получите лучшее качество изображения.

Что касается изменения размеров изображений на основе разных устройств, которые обычно выполняются на уровне сцены. Есть много хороших вопросов SO, которые охватывают много вопросов, которые у вас будут.

Например: Dealing with different iOS device resolutions in SpriteKit

Я рекомендую поискать "создание универсального приложения с SpriteKit".

Надеюсь, это ответ на ваш вопрос и поможет вам начать с других вопросов, которые у вас возникнут.

+0

Я уже создаю изображения, используя разрешения 1x, 2x, 3x. Основываясь на моем разговоре с mecki ниже, я также понимаю, что я должен интегрировать свои изображения в сцену. Жестко-кодирование размера изображения с использованием CGSize не подходит, поскольку размер сцены равен размеру экрана. –

+0

@adf_mobile_developer Размер вашей сцены не требуется для вашего размера экрана. Это зависит от того, как вы создаете свою сцену. Если вы используете проект Apple по умолчанию, вы заметите, что сцена на самом деле намного больше размера экрана/экрана, если вы используете iPhone (сцена была 1024 x 768), но она уменьшена с помощью SKSceneScaleModeAspectFill, и она уменьшает сцену при использовании на телефон. –

Смежные вопросы