1

У меня есть четыре зарегистрированных UIGestureSwipeRecognizers (по одному для каждого направления), и они работают по назначению на iPhone 4/4S (iOS 4.3 и 5) и iPad 1/2 (iOS 4.NotSure и 5). Это игра, поэтому единственными разрешенными ориентациями устройства являются LandscapeRight и LandscapeLeft. Однако на iPhone 3G с iOS 4.1 распознаватели салфетки реагируют так, как будто устройство удерживается в Portrait. Другими словами, на iPhone 3G, то, что должно быть прокруткой Up в LandscapeLeft, регистрируется как правый салфетка. Фактически, все четыре распознавателя салфетки ведут себя так, как если бы устройство находилось в Portrait; однако, я проверил [[UIDevice currentDevice] orientation] и он всегда возвращает UIDeviceOrientationLandscapeLeftUISwipeGestureRecognizer, похоже, не уважает текущую ориентацию UIDevice на iPhone 3G

Кроме того, приложение представляет собой игру, основанную на шаблоне cocos2d 1.0.1.

Что я могу делать неправильно?

Вот мой код, где я зарегистрировать четыре салфетки распознаватели:

_swipeRecognizer_right = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRightDetected)]; 
_swipeRecognizer_right.direction = UISwipeGestureRecognizerDirectionRight; 
[self.view addGestureRecognizer:_swipeRecognizer_right]; 
_swipeRecognizer_right.delegate = self; 

_swipeRecognizer_left = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeLeftDetected)]; 
_swipeRecognizer_left.direction = UISwipeGestureRecognizerDirectionLeft; 
[self.view addGestureRecognizer:_swipeRecognizer_left]; 
_swipeRecognizer_left.delegate = self; 

_swipeRecognizer_up = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeUpDetected)]; 
_swipeRecognizer_up.direction = UISwipeGestureRecognizerDirectionUp; 
[self.view addGestureRecognizer:_swipeRecognizer_up]; 
_swipeRecognizer_up.delegate = self; 

_swipeRecognizer_down = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeDownDetected)]; 
_swipeRecognizer_down.direction = UISwipeGestureRecognizerDirectionDown; 
[self.view addGestureRecognizer:_swipeRecognizer_down]; 
_swipeRecognizer_down.delegate = self; 

ответ

1

Там нет никакого способа вокруг него, кроме преобразования направления. Я сделал это в красть жест распознаватель Kobold2D «s, используя этот внутренний метод, он должен быть легко адаптироваться:

-(KKSwipeGestureDirection) convertSwipeDirection:(UISwipeGestureRecognizerDirection)uiDirection 
{ 
    // portrait mode direction remains unchanged 
    KKSwipeGestureDirection direction = (KKSwipeGestureDirection)uiDirection; 

    switch (uiDirection) 
    { 
     case UISwipeGestureRecognizerDirectionRight: 
     { 
      switch (director.deviceOrientation) 
      { 
       case CCDeviceOrientationPortraitUpsideDown: 
        direction = KKSwipeGestureDirectionLeft; 
        break; 
       case CCDeviceOrientationLandscapeLeft: 
        direction = KKSwipeGestureDirectionUp; 
        break; 
       case CCDeviceOrientationLandscapeRight: 
        direction = KKSwipeGestureDirectionDown; 
        break; 
       default: 
        break; 
      } 
      break; 
     } 

     case UISwipeGestureRecognizerDirectionLeft: 
     { 
      switch (director.deviceOrientation) 
      { 
       case CCDeviceOrientationPortraitUpsideDown: 
        direction = KKSwipeGestureDirectionRight; 
        break; 
       case CCDeviceOrientationLandscapeLeft: 
        direction = KKSwipeGestureDirectionDown; 
        break; 
       case CCDeviceOrientationLandscapeRight: 
        direction = KKSwipeGestureDirectionUp; 
        break; 
       default: 
        break; 
      } 
      break; 
     } 

     case UISwipeGestureRecognizerDirectionUp: 
     { 
      switch (director.deviceOrientation) 
      { 
       case CCDeviceOrientationPortraitUpsideDown: 
        direction = KKSwipeGestureDirectionDown; 
        break; 
       case CCDeviceOrientationLandscapeLeft: 
        direction = KKSwipeGestureDirectionLeft; 
        break; 
       case CCDeviceOrientationLandscapeRight: 
        direction = KKSwipeGestureDirectionRight; 
        break; 
       default: 
        break; 
      } 
      break; 
     } 

     case UISwipeGestureRecognizerDirectionDown: 
     { 
      switch (director.deviceOrientation) 
      { 
       case CCDeviceOrientationPortraitUpsideDown: 
        direction = KKSwipeGestureDirectionUp; 
        break; 
       case CCDeviceOrientationLandscapeLeft: 
        direction = KKSwipeGestureDirectionRight; 
        break; 
       case CCDeviceOrientationLandscapeRight: 
        direction = KKSwipeGestureDirectionLeft; 
        break; 
       default: 
        break; 
      } 
      break; 
     } 
    } 

    return direction; 
} 

Для тех, кто использует Cocos2D 2.x вы должны знать, что CCDirector больше не имеет свойство deviceOrientation. Вместо того, чтобы просто получить ориентацию от UIDevice:

UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 

Тогда просто изменить все тематические метки, заменив CC с префиксом UI, например

case CCDeviceOrientationPortraitUpsideDown: 

должен быть изменен на:

case UIDeviceOrientationPortraitUpsideDown: 
+0

Благодарим за код @ LearnCocos2d. Вы случайно не знаете, является ли это проблемой для конкретного устройства? Мне интересно, на каком наборе устройств мне нужно преобразовать направления салфетки? – jonsibley

+0

На самом деле, что мне действительно интересно, это то, что изменилось между iPhone 3GS и 4, что заставляет swipes уважать ориентацию устройства? Это связано с гироскопом? – jonsibley

+1

Нет, гироскоп в этом не участвует. Я могу только предположить, что он должен иметь какое-то отношение к GameConfig.h. По умолчанию RootViewController используется для авторотации, но НЕ на устройствах 1-го и 2-го поколения. Может быть, что-то также отключает его для iPhone 3GS? В любом случае, это * должно * быть независимо от устройства или способа авторотирования приложения. – LearnCocos2D

1

Я преобразовал функцию, предоставленную @ LearnCocos2D, в Cocos2d-iphone только треску e (т.е. независимо от Kobold2D):

- (UISwipeGestureRecognizerDirection) convertSwipeDirection:(UISwipeGestureRecognizerDirection)uiDirection 
{ 
    // portrait mode direction remains unchanged 
    UISwipeGestureRecognizerDirection direction = (UISwipeGestureRecognizerDirection)uiDirection; 

    // Get cocod2d device orientation 
    ccDeviceOrientation deviceOrientation = [[CCDirector sharedDirector] deviceOrientation]; 

    switch (uiDirection) 
    { 
     case UISwipeGestureRecognizerDirectionRight: 
     { 
      switch (deviceOrientation) 
      { 
       case CCDeviceOrientationPortraitUpsideDown: 
        direction = UISwipeGestureRecognizerDirectionLeft; 
        break; 
       case CCDeviceOrientationLandscapeLeft: 
        direction = UISwipeGestureRecognizerDirectionUp; 
        break; 
       case CCDeviceOrientationLandscapeRight: 
        direction = UISwipeGestureRecognizerDirectionDown; 
        break; 
       default: 
        break; 
      } 
      break; 
     } 

     case UISwipeGestureRecognizerDirectionLeft: 
     { 
      switch (deviceOrientation) 
      { 
       case CCDeviceOrientationPortraitUpsideDown: 
        direction = UISwipeGestureRecognizerDirectionRight; 
        break; 
       case CCDeviceOrientationLandscapeLeft: 
        direction = UISwipeGestureRecognizerDirectionDown; 
        break; 
       case CCDeviceOrientationLandscapeRight: 
        direction = UISwipeGestureRecognizerDirectionUp; 
        break; 
       default: 
        break; 
      } 
      break; 
     } 

     case UISwipeGestureRecognizerDirectionUp: 
     { 
      switch (deviceOrientation) 
      { 
       case CCDeviceOrientationPortraitUpsideDown: 
        direction = UISwipeGestureRecognizerDirectionDown; 
        break; 
       case CCDeviceOrientationLandscapeLeft: 
        direction = UISwipeGestureRecognizerDirectionLeft; 
        break; 
       case CCDeviceOrientationLandscapeRight: 
        direction = UISwipeGestureRecognizerDirectionRight; 
        break; 
       default: 
        break; 
      } 
      break; 
     } 

     case UISwipeGestureRecognizerDirectionDown: 
     { 
      switch (deviceOrientation) 
      { 
       case CCDeviceOrientationPortraitUpsideDown: 
        direction = UISwipeGestureRecognizerDirectionUp; 
        break; 
       case CCDeviceOrientationLandscapeLeft: 
        direction = UISwipeGestureRecognizerDirectionRight; 
        break; 
       case CCDeviceOrientationLandscapeRight: 
        direction = UISwipeGestureRecognizerDirectionLeft; 
        break; 
       default: 
        break; 
      } 
      break; 
     } 
    } 

    return direction; 
} 
+0

Спасибо! Я также добавил исправление для Cocos2D 2.x к своему сообщению. – LearnCocos2D

Смежные вопросы