在iOS应用程序中显示图像

时间:2015-12-05 01:35:43

标签: ios image sprite-kit

我需要在IOS应用程序中显示一些图像。我该怎么做才能让图像在所有设备上正确显示?

我是否必须根据设备手动设置图像的大小?请澄清。

2 个答案:

答案 0 :(得分:2)

您不会仅仅使用SpriteKit来显示图像。您可以将图片加载为UIImage,然后创建一个UIImageView,您可以随时随地放置在屏幕上,然后只需指定UIImageView UIImage UIImageViewUIImageView有许多属性可以设置图像的显示方式(例如,如果缩放它们以及如何缩放它们,或者它们是否未缩放,它们如何在可视区域内对齐,等等)。您可以在SpriteKit场景上绘制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]; ,这在iOS上没问题(在iOS上,一切都是由OpenGL ES或Metal绘制的)。

当然,如果您愿意,也可以将任何图像作为精灵嵌入:

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,并且该图片对于视网膜设备(blah@2.pngblah@3.png-convertPointFromView:的分辨率不同),系统将自动加载它认为最适合当前设备屏幕的图像。这不是你必须处理的事情。

如果您需要在场景坐标和视图坐标之间进行转换,SKScene会针对此案例提供-convertPointToView:DataSet ds = new DataSet(); adapter.fill(ds) if (ds.Tables[0].Rows.Count >= 1) { results = ds.Tables[0]; } dataTblResults.DataSource = results; 。如果场景填满整个屏幕,那么这些实际上在场景和屏幕坐标之间转换。

即使设备具有不同的分辨率,您的场景也可以始终具有相同的“虚拟大小”。因此,无论真正的屏幕分辨率如何,您总是可以说场景是400x300。在这种情况下,将虚拟尺寸200x150的精灵放置在虚拟坐标(100,75)处将始终将其置于屏幕上,无论是什么设备或屏幕有多大(嗯,假设SKSceneView确实涵盖了整个屏幕)当然是screne)。 SKScene的大小只是您想要用于布局游戏的坐标系,它可以是您想要的任何一个,它可以比真实屏幕更大或更小。

场景总是被绘制到SKSceneView中。 SKSceneView的大小是屏幕坐标中场景的实际大小。因此,如果你的SKScene是480x320并且SKSceneView的大小是1440x960,那么在场景中移动精灵一个像素实际上会在屏幕上移动3个像素。然而,如果您的SKScene是1136x640,但您的SKSceneView仅为586x320,那么在场景中移动精灵两个像素只会在屏幕上移动一个像素。您的场景总是按要求放大或缩小。

就我个人而言,我要么在所有设备上坚持使用相同的尺寸,要么只制作两到三个设备类,但不要为每个设备和每个现有的屏幕分辨率采用游戏。

答案 1 :(得分:2)

在SpriteKit中处理图像时需要考虑很多事情,简短的回答是你应该在1x,2x和3x中创建图像(background.png,background @ 2x.png和background@3x.png) 。如果你这样做,你将获得最佳的图像质量。

根据通常在场景级别完成的不同设备调整图像大小。有很多好的SO问题,涵盖了你将要遇到的很多问题。

例如: Dealing with different iOS device resolutions in SpriteKit

我建议搜索“使用SpriteKit创建通用应用程序”。

希望能够回答您当前的问题并帮助您开始解决其他问题。