我正在构建一个 Sprite 套件游戏,并创建了一个带有 Collection View 和按钮的 UIView 来表示游戏内库存。根据我过去使用 UIView 的经验,如果我在另一个之上添加一个,顶部的 UIView 将拦截触摸,除非它的用户交互启用设置为“否”。
但是,当我将库存 UIView
添加到 Scene.view
并将用户交互设置为 YES 时, Sprite 似乎我的场景中 UIView 下方的节点仍然会接收触摸,或者至少将用户交互启用设置为 YES 的节点会接收触摸。
因此,用户可以与我的库存 UIView 进行交互,并且仍然会在库存下的游戏板上引起操作。看来基于 Kobold-Kit 的按钮行为也是随机行为,屏幕一侧的按钮可以通过 UIView 点击,而其他按钮则不能。我的其他具有touchesBegan的节点:代码确实忽略了它们之上的UIView。
我什至尝试在现有场景之上添加另一个节点,这样它将捕获所有触摸,但这在这种情况下似乎没有帮助。
如果我希望某些节点具有交互性,如果有人解释如何正确地将 UIViews 与 SKScene 和 SKSpriteNodes 结合起来,我将不胜感激。
- 我需要一个单独的场景来存放库存吗?
- 是否有办法在库存处于事件状态时禁止将触摸传递到场景?
这是我到目前为止所拥有的:
-(void)didMoveToView:(SKView *)view {
[super didMoveToView:view];
messageConsole = [[MyTextView alloc] initWithFrame:CGRectMake(playerPortraitOffset, 768-75, 415, 75)];
messageConsole.backgroundColor = [UIColor clearColor];
messageConsole.font = [UIFont boldSystemFontOfSize:10];
messageConsole.textColor = [UIColor lightGrayColor];
messageConsole.editable = NO;
[self.view addSubview:messageConsole];
[self.view addSubview:inventoryViewController.view];
}
更新:测试了 Kobold 套件的行为,结果如下:
- 对于顶级 UI 元素,例如 Label、collection View 和 UIButton,它们不会传递触摸
- 对于常规 UIView 和 UIImageView,它们会将触摸传递到场景,即使它们下面有一个交互式 UIButton。删除 UIImage 并公开相同的 UIButton 似乎可以阻止触摸通过。
最佳答案
对所有交互节点使用 KKButtonBehavior 可以解决此问题。
否则,当您显示 UIKit 库存时,请尝试将 SKView 的 userInteractionEnabled
设置为 NO。它还应该阻止具有该属性设置的其他节点接收触摸事件。如果没有并且您不想使用 KKButtonBehavior,则必须将每个节点的 userInteractionEnabled
设置为 NO 以忽略触摸事件,或者添加您自己的标志,以便节点知道在库存时忽略触摸事件起来了。
-(void)preventUserInteraction:(BOOL)prevent
{
//Both seem to disable touches passed to Kobold Kit behaviors under the UIView
self.userInteractionEnabled = !prevent;
//self.scene.userInteractionEnabled = !prevent;
}
关于objective-c - iOS7 Sprite Kit如何将交互式Sprite Nodes和交互式UIViews结合起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20686025/