我做一些自定义布局,包括willAnimateRotationToInterfaceOrientation中的动画:duration: 我遇到的问题是,如果设备从landscapeLeft更改为landscapeRight,界面应该旋转但布局代码,尤其是动画不应该运行。如何检测到它从一个景观变为另一个景观? self.interfaceOrientation以及[[UIApplication sharedApplication] statusBarOrientation]不返回有效结果,他们似乎认为设备已经旋转。因此,以下不起作用。
if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation) && UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]) {...}
答案 0 :(得分:5)
您可以检查设备方向,然后设置一个标记,指示您是处于左方向还是右方向。然后,当您的设备切换时,您可以抓住它并随意处理它。
确定方向使用:
if([UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft)
{
//set Flag for left
}
else if([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight)
{
//set Flag for right
}
您还可以在设备旋转时捕获通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(detectOrientation) name:@"UIDeviceOrientationDidChangeNotification" object:nil];
然后为detectOrientation
编写一个方法,如下所示:
-(void) detectOrientation
{
if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft)
{
//Set up left
} else if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight)
{
//Set up Right
} else if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait || [[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown)
{
//It's portrait time!
}
}
答案 1 :(得分:3)
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft || [[UIDevice currentDevice] orientation ]== UIDeviceOrientationLandscapeRight)
{
NSLog(@"Lanscapse");
}
if([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait || [[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown )
{
NSLog(@"UIDeviceOrientationPortrait");
}
}
答案 2 :(得分:1)
似乎唯一的解决方案是缓存最后的方向更改。到时候willAnimateRotationToInterfaceOrientation:被称为设备和接口方向已经更新。解决方案是在每次更改结束时记录目标方向,以便在方向设置为再次更改时可以查询此值。这并不像我希望的那样优雅(我的视图控制器上还有另一个属性),但据我所知,这似乎是唯一的方法。