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

标签 ios objective-c ipad uitableview sprite-kit

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

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

最佳答案

我使用的方法是:

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

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

  3. 在 ScrollView 委托(delegate)中,实现 scrollViewDidScroll:。在这里您可以使用 ScrollView 的 contentOffset 点来调整节点的位置。

我已经实现了一个可偏移节点,我将其用作需要滚动的内容的根节点。它所做的只是实现一个 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 的子项。

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

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

编辑:关于 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;
}

这不是必需的(您甚至不需要子类化 UIScrollView 来实现此目的)但如果没有这个,您将不得不在 ScrollView 委托(delegate)中手动翻转 contentOffset.Y。

关于ios - 在 SpriteKit 中创建可滚动表格的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22279112/

相关文章:

ios - 我们可以在 iOS 中使用 toxbox/OpenTok 暂停视频通话吗

ios - 在 Storyboard中实例化 xib 时对 initWithCoder 的无限递归调用

ios - 如何使用 NSDateFormatter 获取本地时间(从 ICS 文件解析)

iphone - 自定义标注在 ios6 中显示不正确?

ios - MKAnnotation 点击​​时没有响应

ios - AppDelegate 中的 PushingViewController 无法识别的选择器实例

ios - 如何以编程方式在 UITableViewController 的 NavigationBar 内设置 UISearchDisplayBar

objective-c - Objective C——创建和初始化对象的首选方式

objective-c - MKAnnotation 和 MKAnnotationView 代表什么?

ios - 如何在我的 iPad 应用程序中通过不寻常的曲线路径为一张图像制作动画?