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;

}
Другие вопросы по тегам