【问题标题】:Using UIKit's UIScrollView with SpriteKit将 UIKit 的 UIScrollView 与 SpriteKit 一起使用
【发布时间】:2014-01-14 23:35:15
【问题描述】:

我在这里阅读了两个关于此的问题,两个问题的答案都相同。建议的解决方案是创建 UIScrollView 对象,然后在目标场景的 didMoveToView: 中将其添加到 SKScene 的父视图中,在 willMoveFromView: 中将其删除。

这就是我实现的目标场景代码:

@interface MQSSMakerScene ()

@property BOOL contentCreated;
@property MQSSMakerWorkspaceLayer *workspaceLayer;
@property MQSSMakerDockLayer *dockLayer;
@property UIScrollView *scrollView;

@end


@implementation MQSSMakerScene

- (id)initWithSize:(CGSize)size
{
    if (self = [super initWithSize:size]) {
        CGSize layerSize        = CGSizeMake(944, 140);
        CGPoint layerPosition   = CGPointMake(40, 768-(140+30));
        CGRect viewFrame = CGRectMake(layerPosition.x, layerPosition.y, layerSize.width, layerSize.height);
        _scrollView = [[UIScrollView alloc] initWithFrame:viewFrame];
        _scrollView.contentSize                     = CGSizeMake(2000, 120);
        _scrollView.scrollEnabled                   = YES;
        _scrollView.showsHorizontalScrollIndicator  = YES;
        _scrollView.backgroundColor                 = [UIColor brownColor];
    }

    return self;
}

- (void)didMoveToView:(SKView *)view
{
    [super didMoveToView:view];

    if(!self.contentCreated) {
        [self createSceneContents];
        self.contentCreated = YES;
    }

    [self.view addSubview:_scrollView]; // --> WHERE IT'S BEING ADDED
}

- (void)willMoveFromView:(SKView *)view
{
    [super willMoveFromView:view];

    [_scrollView removeFromSuperview]; // --> WHERE IT'S BEING REMOVED
}

- (void)createSceneContents
{
    self.backgroundColor = [UIColor colorWithHue:.237 saturation:.56 brightness:.46 alpha:1];
    self.scaleMode = SKSceneScaleModeAspectFill;

    [self addChild:[self newMakerLayout]];
}

- (SKNode *)newMakerLayout
{
    SKNode *mainLayout  = [[SKNode alloc] init];
    self.workspaceLayer = [[MQSSMakerWorkspaceLayer alloc] init];
    self.dockLayer      = [[MQSSMakerDockLayer alloc] init];

    [mainLayout addChild:self.workspaceLayer];
    [mainLayout addChild:self.dockLayer];

    MQSSStoryObject *ob1 = [[MQSSStoryObject alloc] initWithImageNamed:@"maker-1.png"];
    [self.workspaceLayer addChild:ob1];

    return mainLayout;
}

@end

请注意,当点击按钮时,用户应该从主场景转到该场景。现在的问题是,一旦我添加了这一行:

[self.view addSubview:_scrollView];

要将 UIScrollView 对象添加到这个场景,应用程序不再进入这个场景,而是将 UIScrollView 添加到我正在转换的主场景中。过渡到另一个场景时,它也不会删除它。一旦我注释掉这一行,一切都按预期工作,显然没有显示 UIScrollView。

我被困住了。非常感谢任何帮助或建议。谢谢!

【问题讨论】:

  • 这是我也面临的确切问题,只有 UITextView。这真的很令人抓狂......似乎也无法让我的 google-foo 帮助我。你找到解决办法了吗?

标签: ios objective-c uiscrollview sprite-kit


【解决方案1】:

我终于弄清楚了我的问题所在。我正在使用 viewController 的 -(void)willLayoutSubviews 方法来确保我有正确的边界,但我忘记查看我的 SKScene 是否已经呈现。这导致每次将视图布置在旧视图之上时都会呈现一个新的welcomeScene。

-(void)willLayoutSubviews
{
    if(!self.didPresentScene)
    {
        // Present scene here
        ....
        self.didPresentScene = YES;
    }
}

【讨论】:

  • 你真是个英雄!一个月了,我还没弄明白,现在就可以了!谢谢。
  • 不客气!我很高兴能帮助别人 :) 编码愉快!
猜你喜欢
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
相关资源
最近更新 更多