我有一个简单的if语句来检测方向并执行操作。这很好用,但它只在第一次工作,它无法再次检测到它。
这个void
是否只被调用一次,如果是这样,我怎样才能改变它来不断检查?
我需要将某些内容移至viewDidLoad
吗?
- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
[super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
{
[self.navigationController pushViewController:graphView animated:YES];
}
else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft)
{
[self.navigationController pushViewController:graphView animated:YES];
}
else if (toInterfaceOrientation == UIInterfaceOrientationPortrait)
{
[self.navigationController popToRootViewControllerAnimated:YES];
NSLog(@"portrait");
}
else
{
[self.navigationController popToRootViewControllerAnimated:YES];
}
}
答案 0 :(得分:1)
[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(orientationChanged:)
name:@"UIDeviceOrientationDidChangeNotification"
object:nil];
答案 1 :(得分:1)
解释@Vjy所写的内容 - 一种解决方案是侦听设备方向通知,然后找到新方向并对其进行响应。
在收到任何设备方向通知之前,您必须致电
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
或者首先不会发送任何通知。开始生成方向通知后,您必须听取它们。 您需要告诉每个相关的视图控制器使用
监听这些通知[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(orientationDetected) //this is your function
name:@"UIDeviceOrientationDidChangeNotification"
object:nil];
然后在orientationDetected
或任何您想要命名的地方 -
- (void) orientationDetected
{
switch ([[UIDevice currentDevice] orientation])
{
case UIDeviceOrientationLandscapeLeft:
// push appropriate view controller
break;
case UIDeviceOrientationPortrait:
// and so on...
break;
}
}
您还可以将通知选择器方法更改为@selector(methodThatReceivesNote:)
(请注意冒号)并让您的方法采用(NSNotification*)
参数,然后查看[paramName userInfo]
以查找相关方向虽然我发现很少有关于UIDevice通知实际包含在userInfo
中的信息。
您还可以研究如何在导航控制器的子视图中处理设备方向更改。我环顾四周,但我真的找不到这个。我确信信息在某处,这可能是一个比通知更强大的解决方案。