gpt4 book ai didi

ios - 使 SKLabelNode 可编辑

转载 作者:搜寻专家 更新时间:2023-10-31 22:36:33 26 4
gpt4 key购买 nike

我正在尝试找出一种方法,在点击 SKLabelNode 时调出键盘,然后让该标签可编辑,类似于 UITextView 或 UITextField。

我已经将 UITextView 添加到 SKScene,但由于它位于场景的顶部,因此这是一个相当笨拙的解决方案。我宁愿尝试以下两种方法之一:1. 当点击 sklabelnode 时出现键盘,或者作为最坏的情况 - 键盘始终打开并且任何输入都反射(reflect)在 SkLabelNode 上。

为了不重新发明轮子,有没有一种方法可以自定义 SKLabelNode 使其更像 UITextView 或 UITextField?

用 Objective-C 或 Swift 回答就可以了。

最佳答案

您所说的非常接近于重新发明轮子。 SKLabelNode,顾名思义,并不意味着像文本字段一样。这里最大的问题是触发键盘并将任何输入传输到标签节点。

这里有一个解决方法。您可以维护一个 UITextField 并将其隐藏在 SKView 上。它的目的是处理来自键盘的输入,这将反射(reflect)在 SKLabelNode 上。

下面的代码需要添加到SKScene类中。可以用,我自己也验证过了。

代码

为 UITextField 维护一个实例变量。我假设标签节点也可以从类中的任何地方访问。

UITextField *field;
SKLabelNode *labelNode; //For demonstrative purposes

按如下方式处理 SKLabelNode 上的触摸

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInNode:self];

SKNode *node = [self nodeAtPoint:point];
if ([node isEqual:labelNode])
{
if (field == nil)
{
field = [[UITextField alloc]initWithFrame:CGRectMake(10, 10, 100, 30)];
field.delegate = self;
field.hidden = true;
[self.view addSubview:field];
}

field.text = labelNode.text;
[field becomeFirstResponder];

}
else
{
[field resignFirstResponder];
//To hide keyboard when tapped outside the label.
}
}

请注意,我们将 UITextFielddelegate 设置为 self。这样做是为了让我们可以在使用以下方法编辑文本字段时从文本字段中获取文本。

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
labelNode.text = newString;
return YES;
}

请注意,您必须在场景的头文件中实现 UITextFieldDelegate。

@interface MyScene : SKScene <UITextFieldDelegate>

警告语

虽然上述解决方法可能会实现您在问题中描述的内容,但 SKLabelNode 仍然不能作为编辑文本的有效工具,因为缺少与之相关的各种视觉辅助工具(例如光标、突出显示等) ).

最好还是使用 UIKit 来编辑表单和文本。

关于ios - 使 SKLabelNode 可编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24129838/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com