2014-06-09 3 views
3

SKLabelNode를 두드린 다음 UITextView 또는 UITextField와 비슷하게 해당 레이블을 편집 가능하게 할 때 키보드를 표시하는 방법을 알아 내려고합니다.SKLabelNode를 편집 가능하게 만들기

나는 이미 SKTene에 UITextView를 추가했으나 장면의 꼭대기에 앉아있는 것처럼 상당히 까다로운 해결책입니다. 차라리 두 가지 중 하나를 시도해보십시오. 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 

핸들 터치 우리가 UITextFielddelegateself로를 설정하는

-(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. 
    } 
} 

공지 사항을 다음과 같이. 이것은 텍스트 필드가 다음의 메소드에서 편집 될 때 텍스트를 가져올 수 있도록 수행되었습니다.

-(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

관련 문제