【问题标题】:View is not displaying after moving from viewWillLayoutSubviews to viewDidLoad从 viewWillLayoutSubviews 移动到 viewDidLoad 后视图不显示
【发布时间】:2014-01-04 19:46:52
【问题描述】:

我一直在尝试自学 Objective-C,但在视图方面遇到了一些问题。

将所有内容从 viewWillLayoutSubviews 移动到 viewDidLoad 后,我的场景无法呈现。 MyScene.m 中的代码正在运行,我只是看不到它。我在这里遗漏了一些明显的缺陷吗?

之前的viewWillLayoutSubviews 方法在下面可用。这里的所有内容都直接切入viewDidLoad,不包括[super viewDidLayoutSubviews]

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    SKView * skView = (SKView *)self.view;
    if (!skView.scene) 
    {
        skView.showsFPS = YES;
        skView.showsNodeCount = YES;

        SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];
        scene = [MyScene sceneWithSize:skView.bounds.size];
        scene.scaleMode = SKSceneScaleModeAspectFill;

        [skView presentScene:scene];
    }

    UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:(scene) action:@selector(screenSwipedRight)];
    swipeRight.numberOfTouchesRequired = 1;
    swipeRight.direction=UISwipeGestureRecognizerDirectionRight;
    [self.view addGestureRecognizer:(swipeRight)];

    UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:(scene) action:@selector(screenSwipedLeft)];
    swipeLeft.numberOfTouchesRequired = 1;
    swipeLeft.direction=UISwipeGestureRecognizerDirectionLeft;
    [self.view addGestureRecognizer:(swipeLeft)];

    UISwipeGestureRecognizer *swipeUp = [[UISwipeGestureRecognizer alloc] initWithTarget:(scene) action:@selector(screenSwipedUp)];
    swipeUp.numberOfTouchesRequired = 1;
    swipeUp.direction=UISwipeGestureRecognizerDirectionUp;
    [self.view addGestureRecognizer:(swipeUp)];

}

如果有帮助,我将所有内容从 viewWillLayoutSubviews 移至 viewDidLoad,以避免在每次视图旋转时重新创建手势识别器。

感谢您的帮助!

【问题讨论】:

    标签: ios objective-c ios7 sprite-kit


    【解决方案1】:

    你为什么这样做?初始化 SKScene 的公认方法是 viewWillLayoutSubviews

    只需在 !skView.scene 块内创建手势识别器:

    if (!skView.scene) 
    {
        // init everything here that should be initialized only once
        // AND should not re-run every time the view rotates
    }
    

    就这么简单。

    【讨论】:

    • 这不会创建多个滑动手势识别器吗?如果没有,我可能得到了一些不好的建议。
    • 没有。因为一旦 SKView 有一个有效的场景,场景属性将永远不会再为零。因此,这段代码只运行一次。
    【解决方案2】:

    我想,你错过了初始化你的 skView 如下

    SKView * skView = (SKView *)self.view;
    

    在访问其场景属性之前。

    【讨论】:

    • 看起来我在格式化时从帖子中删除了该行。对于那个很抱歉。它在应用程序中,我已将其添加回帖子中。
    • 当你说,你只是看不到它,这是什么意思?你的视图什么都没有显示?
    • 我可以看到屏幕上的节点数和 FPS。现在我看了一下,看起来节点没有被添加。我将需要更多地解决这个问题。
    • 如果您在横向模式下渲染场景,那么这些横向绑定将不会在 viewDidLoad 上生效,因为 skView.bounds.size 返回纵向绑定,如果您想要横向绑定,那么您必须在 viewWillLayoutSubviews 方法上创建和初始化 skView。
    • 不能在 ViewDidLoad 中的 self.view 上添加手势,因为 skView 只是指向 self.view 的指针吗?
    猜你喜欢
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    相关资源
    最近更新 更多