无法设置 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.scenenull (我正在谈论)所以没有办法设置它。 ^ 这就是我最终做的,这似乎是一个可以接受的解决方案(到目前为止)。【参考方案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 背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

无法从 Controller 设置 UIView 背景颜色

Photoshop CC 2015无法调整背景颜色

无法设置 JApplet 背景颜色

NSProgressIndicator 无法将背景颜色设置为白色

js中.style.background无法改变背景颜色

Android - 无法使用 ListFragement 设置 LIstView 背景颜色