你說的話非常接近重新發明車輪。顧名思義,SKLabelNode並不意味着像文本字段一樣。這裏最大的問題是觸發鍵盤並將任何輸入傳送到標籤節點。
這是一個解決方法。您可以維護一個UITextField並將其隱藏在SKView上。它的目的是處理來自鍵盤的輸入,它將反映在SKLabelNode上。
以下代碼需要添加SKScene類。它的工作原理,我自己驗證了它。
CODE
維持爲UITextField實例變量。我假設標籤節點也可以從類中的任何地方訪問。在SKLabelNode
UITextField *field;
SKLabelNode *labelNode; //For demonstrative purposes
處理觸摸如下
-(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。
昨晚我看了一眼,並得出結論,我將不得不實施類似這樣的行爲來獲得我一直在尋找的行爲。這絕對有效,所以感謝您提供一些代碼。我也意識到光標,突出顯示等將會丟失,但我預計它會適用於這個小測試。謝謝! – Christian