SKScene iPad 高度宽度反转
Posted
技术标签:
【中文标题】SKScene iPad 高度宽度反转【英文标题】:SKScene iPad height width reversed 【发布时间】:2013-10-14 05:24:05 【问题描述】:我正在尝试在仅支持横向模式的 iPad 应用程序中用图块填充我的 SKScene。在场景中,我检测到 h & w 是这样的:
int h = [UIScreen mainScreen].bounds.size.height;
int w = [UIScreen mainScreen].bounds.size.width;
不幸的是,发回的尺寸与它们需要的尺寸相反。 SO在视图控制器或视图的内容中讨论这个问题有很多主题,解决方案似乎是在viewWillAppear中检测屏幕大小,而不是在viewDidLoad中。然而,这似乎不是 SKScenes 的有效解决方案。
有什么建议吗?
【问题讨论】:
【参考方案1】:尝试,不要使用viewDidLoad
并使用它
- (void)viewWillLayoutSubviews
[super viewWillLayoutSubviews];
SKView * skView = (SKView *)self.view;
if (!skView.scene)
skView.showsFPS = YES;
skView.showsNodeCount = YES;
SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];
scene.scaleMode = SKSceneScaleModeAspectFill;
// Present the scene.
[skView presentScene:scene];
【讨论】:
+1 用于测试视图的场景不为零 - 我见过的大多数解决方案都没有考虑到 viewWillLayoutSubviews 可能被重复调用的事实,即当视图大小或可见性发生变化时 你的意思是不要在viewController中使用viewDidLoad?我应该在哪个文件中实现 viewWillLayoutSubviews? SKScene、ViewController 还是其他地方? 在 ViewController 中,您会看到一个包含与上述内容基本相同的方法,但它是 ViewDidLoad,删除它,以及上述所有方法。 我试过了,它的行为似乎至少有所不同。但是当我这样做时: int h = [UIScreen mainScreen].bounds.size.height; int w = [UIScreen mainScreen].bounds.size.width;在场景中,我得到了不正确的尺寸。当一个人在场景中时,如何获得正确的横向模式高度和宽度? 使用self.frame,在那里你可以访问你需要的,即self.frame.size.height【参考方案2】:在布局处理程序中初始化场景没有意义。 调整布局处理程序中的场景。 (这就是它的用途。)
@implementation SGOMyScene
SKScene *scene;
- (void)viewDidLoad
[super viewDidLoad];
SKView *skView = (SKView *)self.view;
skView.showsFPS = YES;
skView.showsNodeCount = YES;
scene = [SGOMyScene sceneWithSize:skView.bounds.size];
scene.scaleMode = SKSceneScaleModeAspectFill;
[skView presentScene:scene];
- (void)viewWillLayoutSubviews
[super viewWillLayoutSubviews];
SKView *skView = (SKView *)self.view;
scene.size = skView.bounds.size;
您的场景应该实现 - (void)didChangeSize:(CGSize)oldSize
以将所有内容移动到正确的位置。
万岁,现在您的游戏也可以处理设备旋转了。
【讨论】:
希望我能多次投票。虽然在上面和各种书籍中看到的 viewWillLayoutSubviews 技术在一定程度上起作用,但如果您记录场景的实际宽度和高度,它们不会从初始设置改变。而上述内容负责初始化和更改。 另外,viewWillLayoutSubviews 也会在每次设备旋转时被调用,这很痛苦以上是关于SKScene iPad 高度宽度反转的主要内容,如果未能解决你的问题,请参考以下文章