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

And*_*mig 5 objective-c uitableview ipad ios sprite-kit

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

我是否需要为这种事情创建我自己的"自己的"节点,或者更好地在透明背景上使用SKView上面的UITableView?

Jan*_*ins 9

我使用的方法是:

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

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

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

我已经实现了一个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;
}    
Run Code Online (Sandbox Code Playgroud)

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

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

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

编辑:关于scrollview contentOffset Y方向的注释:

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

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

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