当我在SKScene上设置背景图像时。我写了下面的代码:
#import "JTEDMyScene.h"
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
@interface MyScene()
@property BOOL isContentCreated;
@end
@implementation MyScene
-(void) didMoveToView:(SKView *)view
{
if(!self.isContentCreated)
{
self.isContentCreated = YES;
[self createSceneContent];
}
}
-(void)createSceneContent
{
[self addChild:[self createBackground]];
}
-(SKSpriteNode *)createBackground
{
SKSpriteNode *backgroundSprite;
SKTexture *textureImage;
if (IS_IPAD) {
textureImage = [SKTexture textureWithImageNamed:@"home_ipad1.jpg"];
backgroundSprite = [SKSpriteNode spriteNodeWithTexture:textureImage];
}
backgroundSprite.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
return backgroundSprite;
}
设备方向模式仅横向左侧和右侧横向。我的图像大小是宽度= 1024,高度= 768和264 dpi。但是图像没有完全显示图像的一部分显示。
答案 0 :(得分:1)
尝试在viewWillLayoutSubviews中展示和创建MyScene - 如果您还没有这样做的话。 如果您只是将viewDidLoad重命名为viewWillLayoutSubviews并重命名超级调用,它可能会有效。
答案 1 :(得分:1)
Maq有正确的想法。我想他所说的是,问题在于你的视图控制器.m文件,而不是在你的场景中。而不是创建您的SKView和SKScene并从VC的viewDidLoad方法中呈现SKScene,而是将该代码放在viewWillLayoutSubviews方法中。有点像这样:
-(void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
SKView * skView = (SKView *)self.view;
SKScene * scene = [YourScene sceneWithSize:skView.bounds.size];
scene.scaleMode = SKSceneScaleModeAspectFill;
[skView presentScene:scene];
}
显然,viewWillLayoutSubviews会在viewDidLoad之后调用。调用viewDidLoad时,视图尚未添加到视图层次结构中。
Ray Wenderlich的Sprite Kit Tutorial for Beginners引用了this answer来自SO的原因。
答案 2 :(得分:0)
我开始了一个空白项目,并将代码复制粘贴到其中,并且工作正常。我知道你说你设置了你的设备方向,但你是否在项目设置中这样做了?这是我能想到的唯一问题。选择项目,常规选项卡,在“部署信息”下,有一个“设备”下拉框。选择iPad并确保选中“仅左侧风景”和“右侧风景”。我的猜测是该项目认为它应该以纵向模式开始,所以它将你的768高图像垂直拉伸到1024;然后,当您的应用确定它处于横向时,它会相应地旋转拉伸的图像,这会导致图像被截断。
答案 3 :(得分:0)
是的,控制和调整背景图片大小(在我的情况下)对应于设备方向,你必须使用 - (void)viewWillLayoutSubviews
但不要忘记,它默认从第一个场景开始,所以你需要在这个函数中使用一些“sceneNumber”选择器来指向实际的场景