Я искал через SO и пробовал несколько примеров, но я до сих пор не могу понять это поведение. На симуляторе 7.1 сквозное подключение работает, но на 8.1 не работает. Также я задавал ранее аналогичный вопрос, но не такой, как этот, и я решил его, используя метод nodesAtPoint, а затем перебрал все узлы и проверил имя/класс узла. , Но это отличается, потому что теперь я использую собственный класс Button, который реализует touchesBegan, и я хочу, чтобы он обнаруживал и, если возможно, «проглатывал» касания.
Итак, у меня есть простой класс Button, который является подклассом SKSpriteNode, и у него есть свои TouchesBegan и userInteractionEnabled = YES
. В моем представлении свойство контроллера ignoreSiblingsOrder
установлено на YES
.
Вот (упрощенный) пример, который может привести к описанному поведению:
#import "GameScene.h"
@interface Button : SKSpriteNode
-(instancetype)initWithColor:(UIColor *)color size:(CGSize)size;
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
@end
@implementation Button
-(instancetype)initWithColor:(UIColor *)color size:(CGSize)size {
self = [super initWithColor:color size:size];
self.userInteractionEnabled = YES;
return self;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"%@ hit", self.name);
}
@end
@implementation GameScene
-(id)initWithSize:(CGSize)size {
if (self = [super initWithSize:size]) {
self.userInteractionEnabled = NO;
SKNode* root = [SKNode new];
root.name = @"root";
SKNode* layer1 = [SKNode new];
SKNode* layer2 = [SKNode new];
layer1.zPosition = -1;//layer1 and layer2 are just containers
layer2.zPosition = -2;
Button* button = [Button spriteNodeWithColor:[SKColor yellowColor] size:CGSizeMake(100, 100)];
button.name = @"yellow button";
button.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame));
[layer1 addChild:button];
[root addChild:layer1];
[root addChild:layer2];
[self addChild:root];
}
return self;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"Touch detected");
}
@end
Я просто не понимаю, почему это не работает в 8.1... Я знаю, что проверка на попадание идет в порядке, противоположном рендерингу узлов, но тогда как правильно добиться сквозного поведения? Итак, в настоящее время происходит то, что когда я тестирую на 7.1, я получаю сообщение «желтая кнопка», но на 8.1 я получаю сообщение «обнаружено касание» (и когда я печатаю имя узла, он говорит root). Кроме того, из-за этого мне написали радар , но, как я уже сказал, я решил все с помощью nodesAtPoint вместо nodeAtPoint, поэтому я этого не делал. А потому я думал, что это не баг, а скорее моя ошибка, ведь на 7.1 все было нормально. Так это баг или что-то другое?