0

所以我在 UIToolbar 上有一个 UIBarButtonItem,它们是在主情节提要上创建的,然后链接到 ViewController.h 中的 @property 声明。我想在游戏场景(SKScene MyScene)开始时隐藏按钮,并在游戏结束时取消隐藏按钮,并在报告分数后显示游戏结束场景。

在搜索了这个网站后,我发现我可以用两种不同的方式隐藏它,还有其他可能的工作选项。问题是,当我在 - (void)viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; 中设置隐藏按钮所需的值时 在 ViewController.m 部分,我无法更改初始设置值的相对效果,尽管更改了游戏结束时调用的 ViewController.m 的 -reportScore 函数中的值。

隐藏按钮的第一种方法是使用 UIToolbar 上的 alpha 属性,
然后将值设置为 0 或 1.0 以隐藏和显示它。

self.gameCenterToolbar.alpha = 0;

第二种方法是使用 YES 和 NO 为 UIToolbar 设置隐藏属性。
self.gameCenterToolbar.hidden = YES;

为了潜在地帮助其他有类似问题的人,我在这个网站上找到了另外两种建议的方法,但没有尝试过,因为我相信有一个更基本的事情正在发生,我不明白如何让按钮在隐藏后不被隐藏。

第三种方法是创建一个 UIButton 并将行为链接到它,因为它也有一个隐藏的属性。

第四种方法是设置工具栏位置关闭屏幕 是否可以隐藏带有动画的 UIToolbar?

无数天数小时以来,我一直在尝试解决这个问题,并且它阻碍了其他进展,因为在我的游戏中隐藏和取消隐藏按钮是绝对必要的。

预先感谢您花时间帮助我解决我的问题。

这是我认为相关的代码

ViewController.h

#import <UIKit/UIKit.h>
#import <SpriteKit/SpriteKit.h>
#import <GameKit/GameKit.h>

@interface ViewController : UIViewController <GKGameCenterControllerDelegate>

@property (strong, nonatomic) IBOutlet UIBarButtonItem *GameCenterBarButton;
@property (retain, nonatomic) IBOutlet UIToolbar * gameCenterToolbar;
@property (strong, nonatomic) IBOutlet SKView * gameCenterView;




 ViewController.m



#import "ViewController.h"
#import "MyScene.h"
#import "CustomActionSheet.h"

@interface ViewController ()

- (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];

    SKView * skView = (SKView *)self.view;

    if (!skView.scene) {
        skView.showsFPS = NO;
        skView.showsNodeCount = NO;


        // Create and configure the scene.
        SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];
        scene.scaleMode = SKSceneScaleModeAspectFill;

        self.gameCenterToolbar.hidden = YES;
 //or
       self.gameCenterToolbar.alpha = 0;


        // Present the scene.
        [skView presentScene:scene];
}

-(void)reportScore{

    //since reportscore is called each time the game ends, here we unhide the button. 

  self.gameCenterToolbar.alpha = 1.0;
//  or
  self.gameCenterToolbar.hidden = NO;

} 

编辑

我尝试了这两个建议,但它们对我根本不起作用。

  1. 删除并替换 UIToolbar 内容以包含或不包含 barbutton如何从视图中动态隐藏按钮?以及如何显示/隐藏 UIBarButtonItem?

我添加了更新的代码,看起来像这样,但是代码没有任何影响,按钮仍然存在。所以我按照此链接中的建议打印出来以控制台列表。是否可以使用标签访问 UIBarButtonItem?并且列表出来为空

 ViewController.h

#import <UIKit/UIKit.h>
#import <SpriteKit/SpriteKit.h>
#import <GameKit/GameKit.h>

@interface ViewController : UIViewController <GKGameCenterControllerDelegate>

@property (strong, nonatomic) IBOutlet UIBarButtonItem *GameCenterBarButton;
@property (strong, nonatomic) IBOutlet UIToolbar * gameCenterToolbar;
@property (strong, nonatomic) IBOutlet SKView * gameCenterView;

@property (nonatomic, copy) NSArray *items;

- (void)setItems:(NSArray *)items animated:(BOOL)animated;



 ViewController.m



#import "ViewController.h"
#import "MyScene.h"
#import "CustomActionSheet.h"

@interface ViewController ()

- (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];

    SKView * skView = (SKView *)self.view;

    if (!skView.scene) {
        skView.showsFPS = NO;
        skView.showsNodeCount = NO;


        // Create and configure the scene.
        SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];
        scene.scaleMode = SKSceneScaleModeAspectFill;


   NSMutableArray *toolBarButtons = [self.toolbarItems mutableCopy];

   NSLog(@"%@", toolBarButtons);//comes out null


   [toolBarButtons removeObject:self.GameCenterBarButton];

   [self setToolbarItems:toolBarButtons animated:YES];

   NSLog(@"%@", toolBarButtons); //comes out null


        // Present the scene.
        [skView presentScene:scene];
}
  1. 之后我尝试了使用标签的建议,并编辑了代码,将声明添加到 ViewController.h

-(void)removeFromSuperview;

然后修改 ViewController.m 以包含

   UIBarButtonItem * barButton = (UIBarButtonItem *)[self.view viewWithTag:777];

   [barButton removeFromSuperview];

但不幸的是 removeFromSuperview 没有编译。

有人对我可能出错的地方有任何想法吗?我认为这与需要设置的动画值有关......是否可以使用标签访问 UIBarButtonItem ?但是当我设置它时,什么也没发生,所以我认为我做错了。

4

0 回答 0