ios - 将多行文本放入动态改变大小的节点

标签 ios objective-c sprite-kit nsstring nsarray

多行自动输入文本框类(使用 SKNode 作为父级)基本上使用 2 个元素创建:

  • 充当文本框框架和背景图像/纹理容器的 SKSpriteNode。
  • 一个 NSMutableArray,其中包含有限数量(行)的 NSString,每个 NSString 都具有设定的字符长度。

在修改这个文本框类以便它可以用任何框架宽度和高度初始化后,我意识到我没有对 NSMutableArray 进行编程以自动更改其内容以使其很好地适合背景节点(与也涉及一些填充)。所以在这里我想知道如何做到这一点,因为 NSString 只能返回字符数而不是每个字符串的宽度和高度(以点为单位)(点可能以某种方式帮助我创建字符约束)。

现在,NSMutableArray 使用每个 NSString 的硬编码最大字符数和整个数组的最大行数(现在是 5 行,当达到该限制时,将创建一个新的“页面”/数组)。这迫使我每次更改背景节点框架大小时都必须手动重新调整这些参数,这违背了类允许背景框架更改的目的。

问题是,当我在 github 上发布此类时,我正在尝试以这种方式解决这个问题,我希望解决方案考虑到任何 fontName 和 fontSize。

解决这个问题我有哪些选择?

最佳答案

我做过类似的事情。它不能 100% 满足您的需求,但应该足够相似。它使用一个根节点,从那里,它将使用 NSString 数组构建多行文本,该数组又将用于构建 SKLabelNode

我将概述我所做的事情。我还应该说我只在设置新文本时运行它。换句话说,我不会招致每帧都导出信息的惩罚。只有一次。

一般的步骤是:

  • 您将遍历文本字符串中的每个字符。请注意,我这样做是因为我的代码支持自动换行以及其他对齐功能。所以对我来说,我想要那种程度的控制。因为这只是在创建时完成的,所以我可以接受开销。如果您不想自动换行,您可以随时创建一个单词数组并从那里开始工作。
  • 当您遍历每个字符时,您将生成一个线条数组。数组中的每一行都是适合您的框架的行。现在让我们不要担心垂直约束。所以在这里我们主要担心宽度。对于当前行,您迭代的每个字符都将添加到当前行。对于这个潜在的行字符串,您将使用为您的字体配置的 NSStringsizeWithAttributes。例如,在我的代码中,它是一个 NSDictionary,其中包含:NSFontAttributeName : [UIFont fontWithName:self.fontName size:self.size]。这将用于检查宽度,如果该宽度超过框架宽度,则说明您越界了。

所以代码可能看起来像这样:

        size = [line sizeWithAttributes:attributes];

        if (size.width > maxTextWidth) {
            needNewline = YES;
        }
  • 如果您超出了一行,您需要确定您是否在换行。如果是,则只需将当前行(减去一个字符)添加到行数组即可。如果不是,则您已删除当前行中的最后一个单词,然后将其添加到行数组中。
  • 棘手的部分是处理空格和处理非单词换行溢出。我没有解决空白问题,但您需要在代码中充分考虑这一点。此外,您还确实希望将前导像素等因素考虑在内。

一旦你有了你的线数组,你就可以创建你的 child SKLabelNode。我将它们添加到根,这样我就可以将组移动到任何需要的位置。

这里真正的关键是线数组的生成。

关于ios - 将多行文本放入动态改变大小的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39573183/

相关文章:

swift - 按特定类(class)名称搜索 child

ios - Apollo iOS : Command/bin/sh failed with exit code 1 | Command PhaseScriptExecution failed with a nonzero exit code

objective-c - 使用 Restkit 手动添加 ManagedObject

ios - 我可以自动创建UIImageView实例吗?

ios - CLLocationManager 不在 viewDidLoad 上初始化

xcode - 如何使用 Swift Spritekit 每 3 秒调用一个函数

ios - 如何正确地释放一组继承自 SKSpriteNode 的对象

javascript - SVG onclick 事件在 iOS 设备上未触发

ios - 授予联系人权限后,Tableview 不会重新加载

iphone - 以编程方式将一些文本分配给 UITextView 中的特定行