UIButton没有出现在SKScene中

时间:2014-03-01 14:56:20

标签: ios objective-c uibutton sprite-kit

我正在尝试编写一些方法,可用于在我的spritekit项目中生成标签,图像,按钮等。 我在initWithSize方法中调用了setUPScene方法,在setUpScene方法中我调用了三个方法来设置label,image和button。 我的标签和图像出现在主场景中,但我无法成功显示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;

}

2 个答案:

答案 0 :(得分:2)

你的代码不起作用的原因是因为当调用initWithSize:时,场景的view属性设置为nil。

您可以通过将UI初始化代码移动到场景的didMoveToView:方法来处理此问题。然后,在willMoveFromView:中,您可以执行清理(即从视图中删除UIButton)。

这样,特定于场景的UI代码就会保留在场景中,并且不会使视图控制器代码混乱。特别是,如果您决定将UI控件添加到多个场景 - 您只有一个viewcontroller,它可能会变得很乱。

答案 1 :(得分:1)

您必须在拥有场景的viewcontroller中设置按钮,而不是场景本身。

所以,移动

[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当然是它们对应的名称