使SKLabelNode可编辑

基督教

我试图找出一种方法,即在敲击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.
    }
}

请注意,我们在设定UITextFielddelegateself这样做是为了在以下方法中编辑文本时从文本字段中获取文本。

-(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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章