iOS7 Sprite Kit, как объединить интерактивные узлы Sprite и интерактивные UIViews?
Я создаю игру для спрайтов и создал UIView с коллекционными видами и кнопками для представления игрового инвентаря. Из моего прошлого опыта работы с UIView, если я добавлю один поверх другого, верхний UIView будет перехватывать касания, если только для его взаимодействия с пользователем не установлено значение NO.
Тем не менее, когда я добавляю свой инвентарь UIView
в Scene.view
с взаимодействием с пользователем, установленным на YES, кажется, что узлы спрайтов в моей сцене под UIView все еще получают прикосновения, или, по крайней мере, узлы, для которых пользовательское взаимодействие включено, установлено на YES.
В результате пользователь может взаимодействовать с моим инвентарем UIView и при этом вызывать действия на игровом поле под инвентарем. Похоже, что поведение кнопок на основе Kobold-Kit также действует случайным образом, причем с одной стороны экрана они могут быть изменены с помощью UIView, а другие - нет. Мои другие узлы, которые имеют touchSbegan: код, игнорируют 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 Kit со следующими результатами:
- Для элементов пользовательского интерфейса верхнего уровня, таких как Label, Collection View и UIButton, они не пропускают касания
- Для обычных UIViews и UIImageViews они передают прикосновения к сцене ДАЖЕ, ЕСЛИ под ними есть интерактивная кнопка UIB. Удаление UIImage и экспонирование того же UIButton, кажется, останавливает касание от прохождения.
1 ответ
Использование KKButtonBehavior для всех интерактивных узлов решило бы эту проблему.
В противном случае попробуйте установить SKView userInteractionEnabled
НЕТ, пока вы показываете свой инвентарь UIKit. Это также должно остановить другие узлы с этим набором свойств от получения сенсорных событий. Если нет, и вы не хотите использовать KKButtonBehavior, вам придется установить каждый узел userInteractionEnabled
НЕТ, чтобы игнорировать сенсорные события, или добавьте свой собственный флаг, чтобы узлы знали, что они игнорируют сенсорные события, когда инвентарь истощен.
-(void)preventUserInteraction:(BOOL)prevent
{
//Both seem to disable touches passed to Kobold Kit behaviors under the UIView
self.userInteractionEnabled = !prevent;
//self.scene.userInteractionEnabled = !prevent;
}