UIPanGestureRecognizer в SKScene

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

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

-(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];
    }

person EvilAegis    schedule 26.09.2013    source источник


Ответы (2)


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

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

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

Это мой первый пост! Надеясь не споткнуться о собственные пальцы ног...

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

_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");

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

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

person Brad    schedule 02.04.2014