强制导航控制器仅限纵向

时间:2014-03-04 15:30:28

标签: ios uinavigationcontroller uinavigationbar

我在viewWillAppear中有以下代码:

 if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeLeft || [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeRight){

      [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];
      UIViewController *mVC = [[UIViewController alloc] init];
      [self.navigationController presentModalViewController:mVC animated:NO];
      [self.navigationController dismissModalViewControllerAnimated:NO ];
      mVC=nil;
   }

问题在于,xib的buttom中的方法没有被触发。我注意到的是AppDelegate方法的事实:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
//some code
}

被解雇了。怎么解决这个?

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题并搜索了很多页面,很多关于如何将视野和导航栏移回预期位置的想法。虽然我认为UIKit设计不应该期待它。

我发现@Romain的有趣评论覆盖方向相关,我认为这应该是可能的,因为导航栏的高度在iPhone上默认为64纵向,而在旋转到横向时为44在这种情况下隐藏状态栏。事情发生在我身上。

这意味着某些条件导致导航栏处理隐藏状态栏的横向大小写,而实际上并非如此,UIKit的设计不够健壮,无法在错误地覆盖方向方法时使其正确。

我错误的代码导致重叠,如下所示。 1.扩展导航

@implementation UINavigationController(shouldAutorotate)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (BOOL)shouldAutorotate
{
 return self.topViewController.shouldAutorotate;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return self.topViewController.supportedInterfaceOrientations;
}

@end

2。覆盖ViewController中的方向方法

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
- (BOOL)shouldAutorotate
{
    return NO;
}
- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationPortrait;
}

代码引起了重叠的问题,在我再次重新组织后,它可以正常工作。 1.扩展导航控制器

@implementation UINavigationController(shouldAutorotate)

- (BOOL)shouldAutorotate
{
    return self.topViewController.shouldAutorotate;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return self.topViewController.supportedInterfaceOrientations;
}

@end

2。视图控制器的覆盖方法,如果需要将方向固定为纵向。

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

我测试的环境是在iOS8.1.2中。在这里粘贴是因为我冲浪了几个小时而且找不到一个好的解决方案但是很多变通方法,并且感谢Romain给出了正确的方向。

答案 1 :(得分:0)

你应该告诉你的UINavigationController它必须只支持纵向方向。在视图控制器实现中覆盖以下方法:

在iOS 7上:

-(BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

如果您使用的是iOS 6,请添加:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}