我注册了四个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;
}