我试图找出一种方法,在点击SKLabelNode时打开键盘,然后使该标签可编辑,类似于UITextView或UITextField。
我已经在UITextView中添加了一个SKScene,但是因为它位于场景的顶端,所以它是一个相当笨重的解决方案。我宁愿尝试两件事中的一件: 1.键盘在被点击时出现,或者最糟糕的情况是键盘总是打开,任何输入都反映在SkLabelNode上。
为了不重新发明轮子,是否可以定制SKLabelNode,使其更像UITextView或UITextField?
目标C或Swift的答案会很好。
发布于 2014-06-10 09:40:54
你说的话很接近于重新发明轮子。顾名思义,SKLabelNode并不是用来充当文本字段的。这里最大的问题是触发键盘并将任何输入传输到label节点。
这里有个解决办法。您可以维护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进行表单和文本编辑。
https://stackoverflow.com/questions/24129838
复制相似问题