UIPanGestureRecognizer в SKScene

Я экспериментировал с UIGestureRecognizers и новым SKScene/SKNode's в SpriteKit. У меня была одна проблема, и я приблизился к ее исправлению, но меня смущает одна вещь. По сути, у меня есть распознаватель жестов, который позволяет пользователю перетаскивать спрайт на экран.

Единственная проблема, с которой я сталкиваюсь, заключается в том, что для того, чтобы фактически инициализировать жест панорамы, требуется один щелчок, а затем только на SECUT на нем работает правильно. Я думаю, что это связано с тем, что мой жест передвижения инициализируется в touchesBegan. Однако я не знаю, где еще это сделать, поскольку инициализация его в методе SKScene initWithSize остановила распознаватель жестов от фактической работы.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    if (!self.pan) {

        self.pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(dragPlayer:)];
        self.pan.minimumNumberOfTouches = 1;
        self.pan.delegate = self;
        [self.view addGestureRecognizer:self.pan];
    }
}

-(void)dragPlayer: (UIPanGestureRecognizer *)gesture {

        CGPoint trans = [gesture translationInView:self.view];

        SKAction *moveAction =  [SKAction moveByX:trans.x y:-trans.y  duration:0];
        [self.player runAction:move];

        [gesture setTranslation:CGPointMake(0, 0) inView:self.view];
    }

Ответ 1

Это потому, что вы добавляете жест в прикосновениях, так что жест не существует, пока экран не будет прослушиваться хотя бы один раз. Кроме того, я бы удостоверился, что вы действительно используете initWithSize: как ваш инициализатор, потому что у вас не должно возникнуть проблем с добавлением там жеста.

Другой вариант - переместить код, чтобы добавить жест в -[SKScene didMovetoView:], который вызывается сразу после того, как сцена была представлена. Подробнее в документах.

- (void)didMoveToView:(SKView *)view
{
    [super didMoveToView:view];
    // add gesture here!
}

Ответ 2

Это мой первый пост! Надеюсь не путешествовать по моим пальцам...

Привет, ребята, поэтому у меня возникла проблема с UISwipeGestureRecognizer, который не работает. Я инициализировал его в моем методе initWithSize, поэтому на основе этого сообщения я переместил его в мой метод didMoveToView. Теперь он работает (спасибо 0x7fffffff). Все, что я сделал, было отрезано двумя строками одного метода и вставляло их в другой.

_warpGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(warpToNextLevel:)];
[self.view addGestureRecognizer:_warpGesture];

В моем "исследовании" я наткнулся на userInteractionEnabled и попытался установить его в YES в моем методе initWithSize...

self.view.userInteractionEnabled = YES;
NSLog(@"User interaction enabled %s", self.view.userInteractionEnabled ? "Yes" : "No");

Это будет регистрировать NO, хотя я бы просто установил его в YES. Дальнейшее исследование показало, что если я не пытаюсь вручную установить userInteractionEnabled, тогда это НЕТ во время initWithSize (я не могу изменить это, если я хочу), и автоматически получает значение YES, когда я в didMoveToView.

Это все кажется мне актуальным, но я бы хотел, чтобы кто-то из знакомых объяснил, что происходит здесь. Спасибо!