我试图找出一种方法,在点击SKLabelNode然后让该标签可编辑时调出键盘,类似于UITextView或UITextField。
我已经在SKScene中添加了一个UITextView,但由于它位于场景之上,因此它是一个相当笨重的解决方案。我宁愿尝试以下两种方法之一:1。点击sklabelnode时出现键盘,或者最坏的情况 - 键盘始终处于启动状态,任何输入都反映在SkLabelNode上。
为了不重新发明轮子,有没有办法可以定制SKLabelNode以更像UITextView或UITextField?
Objective-C或Swift中的答案没问题。
答案 0 :(得分:3)
你所说的非常接近于重新发明轮子。 SKLabelNode,顾名思义,并不意味着像文本字段一样。这里最大的问题是触发键盘并将任何输入传输到标签节点。
这是一种解决方法。您可以维护UITextField并将其隐藏在SKView上。它的目的是处理来自键盘的输入,这些输入应反映在SKLabelNode上。
需要在SKScene类中添加以下代码。它有效,我自己验证了它。
<强> CODE 强>
维护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.
}
}
请注意,我们将UITextField
的{{1}}设置为delegate
。这已经完成,因此我们可以通过以下方法编辑文本字段中的文本。
self
请注意,您必须在场景的头文件中实现UITextFieldDelegate。
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
labelNode.text = newString;
return YES;
}
警告词
虽然前面提到的解决方法可能会实现您在问题中描述的内容,但由于缺少与之相同的各种视觉辅助工具(例如光标,突出显示等),SKLabelNode仍无法作为编辑文本的有效工具。 )。
最好使用UIKit进行表单和文本编辑。