2014-06-09 83 views
3

我試圖找出一種方法來觸發SKLabelNode時,然後讓該標籤是可編輯的,類似於UITextView或UITextField鍵盤。使SKLabelNode可編輯

我已經添加了一個UITextView到SKScene,但是因爲它位於場景的頂部,所以它是一個相當笨拙的解決方案。我寧願嘗試以下兩種情況之一:1.鍵盤出現在sklabelnode被點擊時,或作爲最壞的情況 - 鍵盤始終打開,並且任何輸入反映在SkLabelNode上。

爲了不重新發明輪子,有沒有辦法可以自定義SKLabelNode以更像UITextView或UITextField?

在Objective-C或Swift中的答案會很好。

回答

3

你說的話非常接近重新發明車輪。顧名思義,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. 
    } 
} 

請注意,我們正在設置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。

+0

昨晚我看了一眼,並得出結論,我將不得不實施類似這樣的行爲來獲得我一直在尋找的行爲。這絕對有效,所以感謝您提供一些代碼。我也意識到光標,突出顯示等將會丟失,但我預計它會適用於這個小測試。謝謝! – Christian