Ios 仅横向应用程序中的UIViewController/UIView方向框/边界

Ios 仅横向应用程序中的UIViewController/UIView方向框/边界,ios,objective-c,uikit,Ios,Objective C,Uikit,关于这一点,已经有一些问题,但没有一个能给出令人满意的答案。我想用最简单的例子确切地知道为什么框架和边界看起来是错误的,并且有人告诉我正确的处理方法是什么 我制作了一个单视图应用程序,没有故事板,我只选择了对景观的支持。然后在didFinishLaunching方法中: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

关于这一点,已经有一些问题,但没有一个能给出令人满意的答案。我想用最简单的例子确切地知道为什么框架和边界看起来是错误的,并且有人告诉我正确的处理方法是什么

我制作了一个单视图应用程序,没有故事板,我只选择了对景观的支持。然后在didFinishLaunching方法中:


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    ViewController *vc = [[ViewController alloc] init];
    self.window.rootViewController = vc;
    [self.window makeKeyAndVisible];

    return YES;
}
在视图控制器中:


- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor redColor];
}

- (void)viewDidAppear:(BOOL)animated
{
    NSLog(@"%.1f,%.1f",self.view.frame.size.width,self.view.frame.size.height);
}
然后输出是768.01024.0-这显然是错误的,即使红色填充了横向大小的屏幕。因此,我不能依赖self.view.frame或self.view.bounds来排列或调整子视图的大小


什么是避免此类问题的最新最恰当的方法?不使用笔尖或故事板,也不进行粗俗的宽度和高度交换

不确定这是否正确,但这是我的最佳猜测,目前无法测试。如果我没有弄错的话,任何应用程序的默认方向都是纵向。因此,为了支持不同的方向,您的应用程序应该实现自动旋转方法。根据您构建的iOS版本,自动旋转方法略有不同。所以,即使您的应用程序被勾选为只支持横向模式,它实际上也不会旋转。尝试实现指定的方法,并让我知道它是如何进行的

对于iOS 5及更早版本,您应使用:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
{
return YES;
}

return NO;
}
-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscape;
}

-(BOOL)shouldAutorotate
{
return YES;
}
对于iOS 6及更高版本,您应使用:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
{
return YES;
}

return NO;
}
-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscape;
}

-(BOOL)shouldAutorotate
{
return YES;
}
如果在旋转发生后检查视图的帧,它应该是正确的

编辑:

看一看,这就是答案。它们提供了一些很好的解决办法。此外,考虑到在应用程序中,您的视图控制器大多嵌入在导航控制器或选项卡栏控制器中,甚至两者都嵌入,您可以继续对它们进行子类化/创建类别,以确保所有内容都转发给视图控制器


另一个解释了实际发生的情况。

您检查帧和边界大小的时间太短了

相反,请在旋转后检查它们:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    NSLog(@"Bounds %@", NSStringFromCGRect(self.view.bounds));
    NSLog(@"Frame %@", NSStringFromCGRect(self.view.frame));
}

试试这个NSLog@%@,self.view;它会给yiu一个框架这不是nslog的问题,记录整个视图对象证实了同样的问题:这似乎是文档中建议的,但是DidRotateFrominerFaceOrientation根本没有被调用。DidRotateFrominerFaceOrientation似乎没有被调用,所以我不确定旋转后如何检查。顺便说一句,我认为支持的接口方向的返回值应该是UIInterfaceOrientationMaskLandscape@jonydep确实有人打电话给它。我自己测试了一下。是的,你使用UIInterfaceOrientationMaskLandscape是对的。另外,请查看更新