在viewDidLoad中错误地报告了方向

时间:2011-12-07 19:00:31

标签: iphone objective-c ios ipad

所以我有一个应用需要加载不同的图像作为背景图像,具体取决于设备的方向。我在viewDidLoad中有以下代码:

BOOL isLandScape = UIDeviceOrientationIsLandscape(self.interfaceOrientation);

if (isLandScape)
{
    self.bgImage.image = [UIImage imageNamed:@"login_bg748.png"];        
}

出于某种原因,即使模拟器在横向开始,这个bool仍然是假的。我检查了它,它总是报告处于纵向模式,无论实际的模拟器方向如何。有没有人知道为什么这不起作用?

在shouldAutoRotateForInterfaceOrientation中,我有以下内容:

if (UIDeviceOrientationIsLandscape(interfaceOrientation))
    {
        self.bgImage.image = [UIImage imageNamed:@"login_bg748.png"];
    } else
    {
        self.bgImage.image = [UIImage imageNamed:@"login_bg1004.png"];        
    }

    return YES;

这段代码确实有效,它只是搞砸的初创公司。在我执行一次旋转后,它可以正常工作。

2 个答案:

答案 0 :(得分:7)

原因是viewDidLoad太早了。每个应用程序都以纵向方式启动,然后旋转到横向。调用viewDidLoad时,旋转尚未发生。您希望使用延迟性能,或将测试放在didRotateFromInterfaceOrientation或类似的地方。请参阅我的书中的解释:

http://www.apeth.com/iOSBook/ch19.html#_rotation

答案 1 :(得分:2)

首先在函数shouldAutoRotateForInterfaceOrientation中,您只需要return YES

现在使用此功能

        -(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
     {

             if  (UIInterfaceOrientationIsLandscape(self.interfaceOrientation))
                {
                         //landscape view login
                 }
             else 
                {
                        //portrait View logic
                 }
     }

如果您已经处于横向视图或纵向视图中,则可以使用viewDidLoad功能

        -(void)viewDidLoad
        {
           if  (UIInterfaceOrientationIsLandscape(self.interfaceOrientation))
         {
                 //landscape view code
            } 

         else
         {
              //portrait view code
         }

       }

希望这会有所帮助