我正在尝试编写一些可用于在我的spritekit项目中生成标签,图像,按钮等的方法。我在 initWithSize 方法中调用我的 setUPScene 方法,在 setUpScene 方法中,我调用三个方法来设置标签、图像和按钮。我的标签和图像出现在主场景中,但我无法成功显示 UIButton 类型按钮。实际上,我寻求一些错误,但我认为一切似乎都是正确的。这是我的方法;
-(void) setUpMainScene {
self.backgroundColor = [SKColor colorWithRed:1.0 green:0.15 blue:0.3 alpha:1.0];
[self addChild:[self createLabel:@"Vecihi"
labelFontName:@"Chalkduster"
labelFontSize:20
labelPositionX:CGRectGetMidX(self.frame)
labelPositionY:CGRectGetMidY(self.frame)]];
[self addChild:[self createImage:@"Spaceship"
imagePositionX:CGRectGetMidX(self.frame)
imagePositionY:CGRectGetMidY(self.frame)+60
imageWidth:40.0
imageHeight:60.0]];
[self.view addSubview:[self createButton:@"ButtonSample.png"
setTitleColor:[UIColor whiteColor]
buttonPositionX:(CGRectGetMidX(self.frame))
buttonPositionY:(CGRectGetMidY(self.frame)-200.0)
buttonWidth:200.0
buttonHeight:70.0]];
}
//Create any label with given parameters
-(SKLabelNode *) createLabel:(NSString *) labelTitle labelFontName:(NSString *) fontName labelFontSize:(int)fontSize labelPositionX:(CGFloat) x labelPositionY:(CGFloat) y {
SKLabelNode *myLabel = [SKLabelNode labelNodeWithFontNamed:fontName];
myLabel.text = labelTitle;
myLabel.fontSize = fontSize;
myLabel.position = CGPointMake(x,y);
return myLabel;
}
//Create any image with given parameters
-(SKSpriteNode *) createImage:(NSString *) imageName imagePositionX:(CGFloat) x imagePositionY:(CGFloat) y imageWidth:(CGFloat) width imageHeight:(CGFloat) height {
SKSpriteNode *myImage = [SKSpriteNode spriteNodeWithImageNamed:imageName];
myImage.position = CGPointMake(x, y);
myImage.size = CGSizeMake(width, height);
return myImage;
}
//Create any button wtih given parameters
-(UIButton *) createButton:(NSString *) buttonImage setTitleColor:(UIColor *) titleColor buttonPositionX:(CGFloat) x buttonPositionY:(CGFloat) y buttonWidth:(CGFloat) width buttonHeight:(CGFloat) height {
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
NSLog(@"%@", buttonImage);
myButton.frame = CGRectMake(x, y, width, height);
myButton.backgroundColor = [UIColor clearColor];
[myButton setTitleColor:titleColor forState:UIControlStateNormal];
[myButton setBackgroundImage:[UIImage imageNamed:buttonImage] forState:UIControlStateNormal];
return myButton;
}
代码不起作用的原因是,当调用 initWithSize: 时,场景的视图属性设置为 nil。
您可以通过将 UI 初始化代码移动到场景的 didMoveToView: 方法来处理此问题。然后,在willMoveFromView:中,您可以执行清理(即从视图中删除UIButton)。
这样,特定于场景的 UI 代码将保留在场景中,并且不会使视图控制器代码混乱。特别是,如果您决定将UI控件添加到多个场景 - 您只有一个视图控制器,并且可能会很快变得混乱。
您必须在拥有场景的视图控制器中设置按钮,而不是场景本身。
所以,移动
[self.view addSubview:[self createButton:@"ButtonSample.png"
setTitleColor:[UIColor whiteColor]
buttonPositionX:(CGRectGetMidX(self.frame))
buttonPositionY:(CGRectGetMidY(self.frame)-200.0)
buttonWidth:200.0
buttonHeight:70.0]];
在 SampleScene.m 中
像这样到 SampleViewController.m
- (void) viewDidLoad {
[self.view addSubview:[self.scene createButton:@"ButtonSample.png"
setTitleColor:[UIColor whiteColor]
buttonPositionX:(CGRectGetMidX(self.view.frame))
buttonPositionY:(CGRectGetMidY(self.view.frame)-200.0)
buttonWidth:200.0
buttonHeight:70.0]];
//More commands not shown...
}
请注意按钮定位和按钮创建的变化
当然,将 SamplesScene 和 SampleViewController 替换为相应的名称