UISwipeGestureRecognizer似乎不尊重iPhone 3G上的当前UIDevice方向



我注册了四个uigestureswiperecognizer(每个方向一个),它们在iPhone 4/4s (iOS 4.3和5)和iPad 1/2 (iOS 4)上按预期工作。5).这是一款游戏,所以唯一允许的设备方向是景观右和景观左。然而,在安装iOS 4.1的iPhone 3G上,滑动识别器的反应就像手机处于竖屏状态一样。换句话说,在iPhone 3G上,在landscape中应该是向上滑动的被注册为向右滑动。事实上,所有四个滑动识别器的行为就好像设备处于纵向;然而,我检查了[[UIDevice currentDevice] orientation],它总是返回UIDeviceOrientationLandscapeLeft

同时,这款应用也是基于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;

除了转换方向之外没有其他方法。我已经在Kobold2D的滑动手势识别器中使用了这个内部方法,它应该很容易适应:

-(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的人。x你应该知道CCDirector不再有deviceOrientation属性。你只需要从UIDevice:

中获取朝向
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];

然后通过将CC替换为UI前缀来更改所有的大小写标签,例如

case CCDeviceOrientationPortraitUpsideDown:

应改为:

case UIDeviceOrientationPortraitUpsideDown:

我已经将@LearnCocos2D提供的功能转换为Cocos2d-iphone仅代码(即独立于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;
}

最新更新