我试图找出一种方法,即在敲击SKLabelNode时启动键盘,然后使该标签可编辑,类似于UITextView或UITextField。
我已经在SKScene中添加了UITextView,但是由于它位于场景的顶部,所以它是一个笨拙的解决方案。我宁愿尝试以下两种方法之一:1.轻击sklabelnode时出现键盘,或者在最坏的情况下-键盘始终处于打开状态,并且任何输入都会反映在SkLabelNode上。
为了避免重蹈覆辙,有没有一种方法可以自定义SKLabelNode以使其更像UITextView或UITextField?
使用Objective-C或Swift的答案就可以了。
您所说的非常接近于重新发明轮子。顾名思义,SKLabelNode并不意味着像文本字段。这里最大的问题是触发键盘并将所有输入传输到标签节点。
这是一种解决方法。您可以维护UITextField并将其隐藏在SKView上。目的是处理来自键盘的输入,该输入应反映在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.
}
}
请注意,我们在设定UITextField
的delegate
到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进行表单和文本编辑。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句