使SKLabelNode可编辑

时间:2014-06-09 22:07:36

标签: ios objective-c sprite-kit swift

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

我已经在SKScene中添加了一个UITextView,但由于它位于场景之上,因此它是一个相当笨重的解决方案。我宁愿尝试以下两种方法之一:1。点击sklabelnode时出现键盘,或者最坏的情况 - 键盘始终处于启动状态,任何输入都反映在SkLabelNode上。

为了不重新发明轮子,有没有办法可以定制SKLabelNode以更像UITextView或UITextField?

Objective-C或Swift中的答案没问题。

1 个答案:

答案 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进行表单和文本编辑。