在SKSpriteKit中创建可滚动表的正确方法是什么?

时间:2014-03-09 06:21:01

标签: ios objective-c ipad uitableview sprite-kit

我需要一种方法来显示排行榜 - 最佳用户分数(本地用户,本地分数)。

我是否需要为此类事物创建“自己的”节点,或者更好地使用透明背景的SKView上方的UITableView?

2 个答案:

答案 0 :(得分:8)

我使用的方法是:

  1. 在场景的didMoveToView:方法中,设置一个UIScrollView实例。设置所需的所有属性,并确保还设置其委托,设置hidden = YES并将其panGestureREcognizer添加到视图手势识别器集合。

  2. 在willMoveFromView中:将其拆除并清理干净。

  3. 在scrollview委托中,实现scrollViewDidScroll:。在这里,您可以使用滚动视图的contentOffset点来调整节点的位置。

  4. 我已经实现了一个offsetable节点,我用它作为根节点来处理我需要滚动的东西。它所做的就是实现一个contentOffset属性 - 你可以在这里看到它:CATOffsetNode Gist

    所以在scrollViewDidScroll中:我需要做的就是:

    -(void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
        // I don't need to flip scrollView.contentOffset.Y because my scrollview
        // Y coordinate is flipped. See below.
        self->_gameListNode.contentOffset = scrollView.contentOffset;
    }    
    

    然后我添加了我需要滚动的所有项目作为_gameListNode的子项。

    结果是一个可滚动的游戏列表,提供原生的滚动视图体验,包括弹性和滑动加速等。

    以下是您可以查看的示例实现:ScrollKit on GitHub

    编辑:请注意有关scrollview contentOffset Y方向

    UIView和SpriteKit Y坐标向相反方向移动(UIView的原点在左上方,Y向下增加),我更喜欢坚持一个坐标系。所以我创建了一个自定义的scrollview类,它在初始化器中翻转Y方向。 E.g:

    -(id)initWithFrame:(CGRect)frame
    {
        if (self = [super initWithFrame:frame])
        {
            CGAffineTransform verticalFlip = CGAffineTransformMakeScale(1,-1);
            self.transform = verticalFlip;
        }
        return self;
    }
    

    这不是必需的(你甚至不需要子类化UIScrollView来实现这一点)但如果没有这个,你必须在scrollview委托中手动翻转contentOffset.Y。

答案 1 :(得分:0)

游戏中心提供排行榜。也许你可以使用那些? Game Center Programming Guide