无法设置 SKView 背景颜色
Posted
技术标签:
【中文标题】无法设置 SKView 背景颜色【英文标题】:Unable to set SKView backgroundColor 【发布时间】:2014-03-29 23:14:46 【问题描述】:我遇到了一个问题,即我的 SKView 的背景颜色(灰色)在呈现场景之前会短暂显示。
我通过 Storyboard 编辑器和我的控制器 (self.skView.backgroundColor = [SKColor blueColor]
) 手动尝试设置它,但它仍然是灰色的。这不是可以被覆盖的属性吗?
更新 #1
下面是关于发生了什么的一点解释:
viewDidLoad
被调用,skView
以灰色背景显示在屏幕上(skView.scene
尚未设置)。
我加载了游戏的所有资源(大约需要 1 秒),此时灰色背景可见。
加载资产后,我加载场景并呈现它(灰屏被场景内容替换)
视图控制器
- (void)viewDidLoad
[self.activityIndicator startAnimating];
[self authenticatePlayer];
self.skView.backgroundColor = [SKColor blueColor];
// During this time the grey screen is visible as the assets are being loaded and take ~1 second
// self.skView.scene is NULL here so I cannot set the backgroundColor...
[GamePlayScene loadSceneAssetsWithCompletionHandler:^
[self.activityIndicator stopAnimating];
self.activityIndicator.hidden = YES;
CGSize viewSize = self.skView.bounds.size;
self.gamePlayScene = [[GamePlayScene alloc] initWithSize:viewSize];
self.adView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
[self.skView presentScene:self.gamePlayScene];
];
...
【问题讨论】:
【参考方案1】:我想你把它误认为SKScene property of the same name:
self.scene.backgroundColor = [SKColor blueColor];
请注意,self.scene
(也称为self.view
)将为零,直到将节点作为子节点添加到另一个节点(已经是场景图的一部分)之后,直到呈现场景。
【讨论】:
SKView 不只是继承自 UIView(它有一个 backgroundColor 属性)吗? 另外,我更新了我的问题并提供了更多细节。 不需要更多细节,案例很清楚。您需要更改 SKScene 的 backgroundColor 属性,而不是视图的。视图具有相同的属性,但场景是被渲染(不透明)到视图中的内容,因此只有场景的背景颜色生效。skView.scene
是 null
(我正在谈论)所以没有办法设置它。
^ 这就是我最终做的,这似乎是一个可以接受的解决方案(到目前为止)。【参考方案2】:
您应该能够在呈现视图控制器viewDidLoad
中设置SkView
背景颜色 - 在呈现视图之前。这没有发生吗?
假设您已将其添加到父节点
【讨论】:
【参考方案3】:恐怕您要么必须在完成最基本的设置(如设置背景颜色)后呈现场景,然后加载其余部分,要么在游戏场景加载之前呈现“正在加载”场景,然后替换它。
【讨论】:
问题是self.skView.scene
在短时间内为空(请参阅我更新的问题)。
是的,SKView 似乎是由 CAEAGLLayer 支持的,就像 GLKView 一样。这就是灰色的来源。改变它是可能的(有一些关于 SO 的答案),但我认为对于这种情况,这有点矫枉过正。看看我更新的答案。【参考方案4】:
使用 sprite kit 的基本模板,我可以在 GameViewController.m 文件中使用以下代码将背景设置为黑色:
- (void)viewDidLoad
[super viewDidLoad];
// Configure the view.
SKView * skView = (SKView *)self.view;
skView.showsFPS = YES;
skView.showsNodeCount = YES;
/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = YES;
// Create and configure the scene.
GameScene *scene = [GameScene sceneWithSize:skView.bounds.size];
scene.scaleMode = SKSceneScaleModeAspectFill;
scene.backgroundColor = [UIColor blackColor];
// Present the scene.
[skView presentScene:scene];
不确定这是否正是您要寻找的,但它摆脱了似乎并没有消失的灰色背景。在您的情况下,我认为您希望在初始化场景后设置“gamePlayScene”背景颜色属性。
希望这会有所帮助!
【讨论】:
OP 要求 SKView 背景颜色,而不是 SKScene 我知道这不是 OP 想要的,但它可以工作并且可能是最简单的解决方案。我不认为它有任何不利影响,所以做一个与另一个是无关紧要的。 :)以上是关于无法设置 SKView 背景颜色的主要内容,如果未能解决你的问题,请参考以下文章