我正在使用设备方向通知,以便知道设备是否已旋转,以便我可以执行选择器。这是我正在使用的代码:
- (void)awakeFromNib
{
isShowingLandscapeView = NO;
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(orientationChanged:)
name:UIDeviceOrientationDidChangeNotification
object:nil];
}
- (void)orientationChanged:(NSNotification *)notification
{
UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
if (UIDeviceOrientationIsLandscape(deviceOrientation) &&
!isShowingLandscapeView)
{
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
[self performSegueWithIdentifier:@"landscape" sender:self];
isShowingLandscapeView = YES;
}
else if (UIDeviceOrientationIsPortrait(deviceOrientation) &&
isShowingLandscapeView)
{
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];
[self dismissViewControllerAnimated:YES completion:nil];
isShowingLandscapeView = NO;
}
}
但是,当我导航到其他子视图并旋转设备时,执行选择器,尽管上面的代码位于独立于其他视图所具有的类的类中。那我该怎么办呢?我试过了:
[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
它也没用。旋转设备时,我的应用程序实际上会以横向模式弹出另一个视图。所以在子视图中,横向视图出现在我旋转设备中。我该如何解决这个问题?
答案 0 :(得分:2)
删除UIDeviceOrientationDidChangeNotification
[[NSNotificationCenter defaultCenter] removeObserver:self name: UIDeviceOrientationDidChangeNotification object:nil];
删除所有通知
[[NSNotificationCenter defaultCenter] removeObserver:self];
答案 1 :(得分:0)
在父视图控制器中:
- (BOOL)shouldAutomaticallyForwardRotationMethods {
return NO;
}
来自文档:
调用此方法以确定是否自动转发 与子视图控制器相关的与旋转相关的包含回调。
默认实现返回
YES
。的子类 实现包含逻辑的UIViewController类可以覆盖 这种方法可以控制这些方法的转发方式。如果你 覆盖此方法并返回NO
,您负责转发 以下方法适用于子视图控制器 次:
willRotateToInterfaceOrientation:duration:
willAnimateRotationToInterfaceOrientation:duration:
didRotateFromInterfaceOrientation: