所以我在 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;
}
编辑
我尝试了这两个建议,但它们对我根本不起作用。
- 删除并替换 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];
}
- 之后我尝试了使用标签的建议,并编辑了代码,将声明添加到 ViewController.h
-(void)removeFromSuperview;
然后修改 ViewController.m 以包含
UIBarButtonItem * barButton = (UIBarButtonItem *)[self.view viewWithTag:777];
[barButton removeFromSuperview];
但不幸的是 removeFromSuperview 没有编译。
有人对我可能出错的地方有任何想法吗?我认为这与需要设置的动画值有关......是否可以使用标签访问 UIBarButtonItem ?但是当我设置它时,什么也没发生,所以我认为我做错了。