Kann jemand bitte einige Links für die Verwendung von UITextField in cocos2d vorschlagen. Ich möchte auf Etikett drücken, dann sollte die UITextField
ausgewählt werden und ich muss auf dieser UITextField
bearbeiten.UITextField Beispiel in Cocos2d
Antwort
Ich mache das in einem aktuellen Projekt, um die Nummer des Levels einzugeben, mit dem ich anfangen soll zu spielen, deshalb werden meine Variablen und Methoden so benannt, wie sie sind; Sie sollten diese wahrscheinlich anpassen, um für Sie sinnvoll zu sein.
In Ihrer App Controller definieren dies als Instanzvariable:
UITextField *levelEntryTextField;
erstellen es in applicationDidFinishLaunching:
levelEntryTextField = [[UITextField alloc] initWithFrame:
CGRectMake(60, 165, 200, 90)];
[levelEntryTextField setDelegate:self];
eine Methode definieren Sie das Textfeld zu aktivieren. Sie sollten dies auch in der Header-Datei für Ihren App-Controller deklarieren.
- (void)specifyStartLevel
{
[levelEntryTextField setText:@""];
[window addSubview:levelEntryTextField];
[levelEntryTextField becomeFirstResponder];
}
Damit wird „Rückkehr“ auf der Tastatur Ende Bearbeitung
- (BOOL)textFieldShouldReturn:(UITextField*)textField {
//Terminate editing
[textField resignFirstResponder];
return YES;
}
Drücken dieser ausgelöst wird, wenn die Bearbeitung tatsächlich durchgeführt wird.
Jetzt um tatsächlich Dinge in Bewegung zu setzen, setzen Sie dies irgendwo. Ich nenne dies aus einer meiner Szene Klassen, in Reaktion auf eine Benutzeraktion:
[[[UIApplication sharedApplication] delegate] specifyStartLevel];
Ich nahm das Beispiel, das Jack zur Verfügung gestellt und tatsächlich ein funktionierendes Projekt geschaffen, das getan wurde die Cocos2D 0.7.1 XCode Vorlage verwenden und dann nur die * AppDelegate.m/.h Dateien, die unten in der Gesamtheit zur Verfügung gestellt werden. Ich habe auch etwas von dem geändert, was Jack gesagt hat, weil ich denke, dass das Erstellen des UITextField in der appDidFinishLoading ein wenig zu viel Speicher benötigt, besonders wenn das Textfeld nicht immer benutzt wird ... diese Lösung erzeugt das Textfeld nur dann Wenn das Sample benötigt wird, wird eine leere Cocos2D-Layerszene gezeichnet und auf dem Bildschirm wird das Textfeld angezeigt, in das Sie Text eingeben können. Es spuckt das Ergebnis dessen aus, was Sie in die Konsole eingegeben haben - Sie können dies an das weitergeben, was in Ihrem eigenen Code notwendig ist.
die .h
#import <UIKit/UIKit.h>
#import "cocos2d.h"
@interface MYSCENE : Layer <UITextFieldDelegate>
{
UITextField *myText;
}
-(void)specificStartLevel;
@end
@interface textFieldTestAppDelegate : NSObject <UIAccelerometerDelegate, UIAlertViewDelegate, UITextFieldDelegate, UIApplicationDelegate>
{
UIWindow *window;
}
@end
und dann die .m
#import "textFieldTestAppDelegate.h"
@implementation MYSCENE
-(id) init
{
self = [super init];
isTouchEnabled = YES;
return self;
}
-(BOOL)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self specifyStartLevel];
return kEventHandled;
}
-(void)specifyStartLevel {
myText = [[UITextField alloc] initWithFrame:CGRectMake(60, 165, 200, 90)];
[myText setDelegate:self];
[myText setText:@""];
[myText setTextColor: [UIColor colorWithRed:255 green:255 blue:255 alpha:1.0]];
[[[[Director sharedDirector] openGLView] window] addSubview:myText];
[myText becomeFirstResponder];
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField {
[myText resignFirstResponder];
return YES;
}
-(void)textFieldDidEndEditing: (UITextField *)textField {
if(textField == myText) {
[myText endEditing:YES];
[myText removeFromSuperview];
NSString *result = myText.text;
NSLog([NSString stringWithFormat:@"entered: %@", result]);
} else {
NSLog(@"textField did not match myText");
}
}
-(void) dealloc
{
[super dealloc];
}
@end
@implementation textFieldTestAppDelegate
- (void)applicationDidFinishLaunching:(UIApplication *)application
{
window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[window setUserInteractionEnabled:YES];
[[Director sharedDirector] setDisplayFPS:YES];
[[Director sharedDirector] attachInWindow:window];
Scene *scene = [Scene node];
[scene addChild: [MYSCENE node]];
[window makeKeyAndVisible];
[[Director sharedDirector] runWithScene: scene];
}
-(void)dealloc
{
[super dealloc];
}
-(void) applicationWillResignActive:(UIApplication *)application
{
[[Director sharedDirector] pause];
}
-(void) applicationDidBecomeActive:(UIApplication *)application
{
[[Director sharedDirector] resume];
}
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
[[TextureMgr sharedTextureMgr] removeAllTextures];
}
@end
danke bro. nice done – OMGPOP
Das sollte [[[[CCDirector sharedDirector] openGLView] Fenster] addSubview: myText]; anstelle von [[[[Director sharedDirector] openGLView] Fenster] addSubview: myText]; –
die folgende CCNode Unterklasse versuchen, CCMenuItemTextField, Textfelder in cocos2d zu verwenden.
Die Klasse ist direkt von CCMenuItemSprite abgeleitet. Beim Antippen wird die Methode "selected" aufgerufen und ein UITextField zum Hauptfenster hinzugefügt. Nach der Bearbeitung wird die Methode "unselected" aufgerufen und das UITextField vom Bildschirm entfernt. Die Benutzereingabe wird in einem CCLabelTTF-Knoten gespeichert, der sich genau wie das ursprüngliche UITextField positioniert.
CCMenuItemTextField.h
@interface CCMenuItemTextField : CCMenuItemSprite<UITextFieldDelegate> {
UITextField *textField_;
CCLabelTTF *label_;
CGFloat paddingLeft_;
}
@property (readonly, nonatomic) UITextField *textField;
@property (readonly, nonatomic) CCLabelTTF *label;
@property (assign, nonatomic) CGFloat paddingLeft;
- (void)selected;
- (void)unselected;
- (void)setFontSize:(CGFloat)size;
- (NSString*)text;
- (void)setText:(NSString*)text;
@end
CCMenuItemTextField.m
#import "CCMenuItemTextField.h"
@implementation CCMenuItemTextField
@synthesize
textField = textField_,
label = label_,
paddingLeft = paddingLeft_;
- (id)init
{
CCSprite *normalSprite = [CCSprite spriteWithFile:@"text_field_background.png"];
CCSprite *selectedSprite = [CCSprite spriteWithFile:@"text_field_background.png"];
CCSprite *disabledSprite = [CCSprite spriteWithFile:@"text_field_background.png"];
return [self initWithNormalSprite:normalSprite selectedSprite:selectedSprite disabledSprite:disabledSprite];
}
- (id)initWithNormalSprite:(CCNode<CCRGBAProtocol> *)normalSprite
selectedSprite:(CCNode<CCRGBAProtocol> *)selectedSprite
disabledSprite:(CCNode<CCRGBAProtocol> *)disabledSprite
{
self = [super initWithNormalSprite:normalSprite
selectedSprite:selectedSprite
disabledSprite:disabledSprite
target:self
selector:@selector(selected)];
if (self) {
paddingLeft_ = 3.0;
textField_ = [[UITextField alloc] init];
[textField_ setTextColor:[UIColor blackColor]];
[textField_ setFont:[UIFont systemFontOfSize:18]];
label_ = [[CCLabelTTF node] retain];
[label_ setAnchorPoint:ccp(0,0.5)];
[label_ setFontSize:18];
[label_ setVisible:NO];
[label_ setColor:ccBLACK];
[self addChild:label_];
}
return self;
}
- (void)dealloc
{
[label_ release];
[textField_ release];
[super dealloc];
}
// --------------------------------
// Public
// --------------------------------
- (void)selected
{
[super selected];
[label_ setVisible:NO];
CGAffineTransform transform = [self nodeToWorldTransform];
float textFieldHeight = textField_.font.lineHeight;
float width = self.contentSize.width;
float height = self.contentSize.height;
float left = transform.tx + paddingLeft_;
float top = 480 - transform.ty - height + (height - textFieldHeight)/2;
[textField_ setFrame:CGRectMake(left, top, width, height)];
[[[[CCDirector sharedDirector] view] window] addSubview:textField_];
[textField_ becomeFirstResponder];
[textField_ setDelegate:self];
}
- (void)unselected
{
[super unselected];
[label_ setVisible:YES];
[label_ setPosition:ccp(paddingLeft_, self.contentSize.height/2)];
NSString *text = textField_.text ? textField_.text : @"";
[label_ setString:text];
[textField_ resignFirstResponder];
[textField_ removeFromSuperview];
}
- (NSString*)text
{
return [label_ string];
}
- (void)setText:(NSString*)text
{
[label_ setString:text];
[textField_ setText:text];
}
// --------------------------------
// UITextFieldDelegate
// --------------------------------
- (BOOL)textFieldShouldReturn:(UITextField*)textField {
[self unselected];
return YES;
}
- (void)textFieldDidEndEditing:(UITextField*)textField {
[self unselected];
}
- (void)setFontSize:(CGFloat)size
{
[label_ setFontSize:size];
[textField_ setFont:[UIFont systemFontOfSize:size]];
}
// --------------------------------
// CCNode
// --------------------------------
- (void)onExitTransitionDidStart
{
[super onExitTransitionDidStart];
[self unselected];
}
@end
Welche Cocos2d Version hast du benutzt? Es scheint nicht direkt mit v1.1 zu funktionieren. –
Um Textfeld in cocos2d wie unten Code
allererst hinzufügen Sie Ansicht in Szene und afetr Add Textfeld in Sicht, das ist sehr einfach hinzufügen.
-(id) init
{
if((self=[super init]))
{
// add view in scene
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 568)];
view.backgroundColor = [UIColor redColor];
// add textfield in view
UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 140, 300, 30)];
textField.borderStyle = UITextBorderStyleRoundedRect;
textField.font = [UIFont systemFontOfSize:15];
textField.placeholder = @"enter text";
textField.autocorrectionType = UITextAutocorrectionTypeNo;
textField.keyboardType = UIKeyboardTypeDefault;
textField.returnKeyType = UIReturnKeyDone;
textField.clearButtonMode = UITextFieldViewModeWhileEditing;
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
textField.delegate = self;
[view addSubview:textField];
// add view in scene
[[[CCDirector sharedDirector] view] addSubview:view];
}
return self;
}
Sie auch CCTextfield in cocos2d beste Beispiel ist https://github.com/iNinja/CCTextField
hey, ich habe versucht, auf diese Weise aber nur die Tastatur zeigt sich nutzen können. Ich habe das Textfeld nicht gesehen – OMGPOP
Versuchen Sie [textBox setTextColor: [UIColor colorWithRed: 0 grün: 0 blau: 0 alpha: 1.0]]; [textBox setBackgroundColor: [UIColor colorWithRed: 255 grün: 255 blau: 255 alpha: 1.0]]; – RSH1
Was ist 'Fenster' in' specifyStartLevel'? ok für diese echten Anfänger ist es '[[[[CCDorector sharedDirector] view] Fenster]'. – Claudiu