UIButton没有出现在SKScene中



我正在尝试编写一些可用于在我的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 替换为相应的名称

最新更新