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

6
我需要一种展示排行榜的方式-最佳用户分数(本地用户,本地分数)。
我需要为此类事物创建自己的“节点”,还是最好使用具有透明背景的UITableView和SKView?
2个回答

10
我采用的一种方法是:
  1. 在场景的didMoveToView:方法中,设置一个UIScrollView实例。设置所有需要的属性,并确保还设置了其委托(delegate),将hidden设置为YES,并将它的panGestureRecognizer添加到视图手势识别器集合中。

  2. 在willMoveFromView:方法中,拆卸并清理它。

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

我已经实现了一个可偏移的节点(CATOffsetNode),我将其用作需要滚动的根节点。它所做的就是实现一个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的子项添加。
结果是一个可滚动的游戏列表,提供本地滚动视图体验,包括反弹和滑动加速等功能。
这是一个示例实现,您可以查看:GitHub上的ScrollKit
编辑:关于scrollview contentOffset Y方向的说明:
UIView和SpriteKit的Y坐标方向相反(UIView的原点在左上角,Y向下增加),我更喜欢坚持一个坐标系。因此,我制作了一个自定义滚动视图类,在初始化器中翻转了Y方向。例如:
-(id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame])
    {
        CGAffineTransform verticalFlip = CGAffineTransformMakeScale(1,-1);
        self.transform = verticalFlip;
    }
    return self;
}

这并非必须的(而且您甚至不需要子类化UIScrollView来实现此操作),但是如果没有这个,您将不得不在滚动视图代理中手动翻转contentOffset.Y。


有趣,谢谢。但是你为什么要使用UIScrollView而不是UITableView呢?假设您不需要水平滚动。嗯...只是想到使用UISrcollView可以为SpriteKit中的滚动带来更多的功能。 - AndrewShmig
UIScrollView 目前符合我的需求,所以我甚至没有考虑使用其他的东西。我也使用水平滚动,但是我使用嵌套的 scrollview 来实现。顺便提一下,我在我的答案中更新了有关 UIView Y 坐标的评论,我最初忘记提到了。 - Janis Kirsteins
最后一个问题:为什么您要在didMoveToView:中配置UIScrollView?为什么不在init方法或其他地方?只是好奇。 - AndrewShmig
场景在添加到视图之前会被初始化,因此当调用initWithSize:时,scene.view将为nil。didMoveToView:是场景确保拥有对其视图引用的最早的地方。 - Janis Kirsteins
那么,在场景呈现之前,配置场景的正确方式是什么?(https://dev59.com/-X3aa4cB1Zd3GeqPcmUd) - AndrewShmig

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接