Ios UISweepGestureRecognitor不';t似乎不尊重iPhone 3G上当前的设备定位
我已经注册了四个UIgestureSwipereConceptors(每个方向一个),它们可以在iPhone4/4S(iOS 4.3和5)和iPad1/2(iOS 4.NotSure和5)上正常工作。这是一个游戏,所以唯一允许的设备方向是LandscapeRight和LandscapeLeft。然而,在配备iOS 4.1的iPhone3G上,滑动识别器的响应就像是将设备放在肖像中一样。换句话说,在iPhone3G上,在LandscapeLeft中应该向上滑动的内容将注册为右滑动。事实上,所有四个刷卡识别器的行为就像设备是纵向的;但是,我已经检查了Ios UISweepGestureRecognitor不';t似乎不尊重iPhone 3G上当前的设备定位,ios,cocoa-touch,cocos2d-iphone,uigesturerecognizer,uiswipegesturerecognizer,Ios,Cocoa Touch,Cocos2d Iphone,Uigesturerecognizer,Uiswipegesturerecognizer,我已经注册了四个UIgestureSwipereConceptors(每个方向一个),它们可以在iPhone4/4S(iOS 4.3和5)和iPad1/2(iOS 4.NotSure和5)上正常工作。这是一个游戏,所以唯一允许的设备方向是LandscapeRight和LandscapeLeft。然而,在配备iOS 4.1的iPhone3G上,滑动识别器的响应就像是将设备放在肖像中一样。换句话说,在iPhone3G上,在LandscapeLeft中应该向上滑动的内容将注册为右滑动。事实上,所有四个
[[UIDevice currentDevice]orientation]
,它总是返回uideviceorientation和scapeleft
case CCDeviceOrientationPortraitUpsideDown:
此外,该应用程序是基于CoCoS2D1.0.1模板构建的游戏
case CCDeviceOrientationPortraitUpsideDown:
我可能做错了什么
case CCDeviceOrientationPortraitUpsideDown:
这是我注册四个刷卡识别器的代码:
_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;
case CCDeviceOrientationPortraitUpsideDown:
除了转换方向之外,没有别的办法了。我在的“滑动手势识别器”中使用了这种内部方法,它应该很容易适应:
-(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;
}
case CCDeviceOrientationPortraitUpsideDown:
对于那些使用Cocos2D 2.x的用户,您应该知道CCDirector不再具有deviceOrientation属性。相反,您只需从UIDevice获取方向:
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
case CCDeviceOrientationPortraitUpsideDown:
然后只需更改所有大小写标签,例如,用UI前缀替换CC
case CCDeviceOrientationPortraitUpsideDown:
应改为:
case CCDeviceOrientationPortraitUpsideDown:
case UIDeviceOrientationPortraitUpsideDown:
我已将@LearnCos2D提供的函数转换为仅适用于Cocos2d iphone的代码(即独立于Kobold2D):
case CCDeviceOrientationPortraitUpsideDown:
谢谢你的代码@learncos2d。您知道这是否是设备特定的问题吗?我想知道我需要在哪一套设备上转换滑动方向?事实上,我真正想知道的是,iPhone 3GS和4之间发生了什么变化,导致滑动尊重设备方向?这和陀螺仪有关吗?不,陀螺仪不在其中。我只能假设它一定与GameConfig.h有关。默认情况下,RootViewController用于自动旋转,但不用于第一代和第二代设备。也许这也会使iPhone3GS无法使用它?无论如何,这应该独立于设备或应用程序的自动旋转方式。对不起,我在之前的评论中说了“iPhone3GS”,但我的意思是“iPhone3G”。此外,我可以验证此解决方案是否独立于设备(在iPhone 4、3G和iPod touch 1G上进行了测试)。谢谢!我还将cocos2d2.x的补丁添加到我的帖子中。