iPad/iPhone 方向问题

Posted

技术标签:

【中文标题】iPad/iPhone 方向问题【英文标题】:iPad/iPhone orientation issue 【发布时间】:2012-04-16 17:41:21 【问题描述】:

我意识到有很多与此问题相关的问题,但是我还没有找到一个可以解决我的问题的问题。

首先,我在 menu.h 中设置了这段代码

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation     
return YES; 

状态栏会随着方向而改变,但视图不会旋转或调整大小。为了尝试缩小我的问题,我决定尝试根据方向在一个 .xib 中切换两个视图

    - (void)viewDidLoad 
    [super viewDidLoad];

    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:@"UIDeviceOrientationDidChangeNotification" object:nil];
     
    -(void) orientationChanged:(NSNotification *)object

   UIDeviceOrientation deviceOrientation = [[object object] orientation];

    if (deviceOrientation == UIDeviceOrientationLandscapeLeft || deviceOrientation == UIDeviceOrientationLandscapeRight)
    
        self.view = self.landscapeView;
    
    else 
    
        self.view = self.portraitView;
    

ios 模拟器中,视图肯定会更改为特定视图。然而,横向视图显示为纵向和横向。

我在 IB 中的横向视图

更改方向后我在 iOS 模拟器中的横向视图

我在这里做错了什么?我无法弄清楚,任何帮助将不胜感激。先感谢您。 ** 编辑:下面的新代码 ** 好的..我的问题是视图在横向上正确加载,它只是横向的。所以横向视图加载,只是横向。我基于@Seega 修改的代码是:

- (void)viewDidLoad 
    [super viewDidLoad];
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:@"UIDeviceOrientationDidChangeNotification" object:nil];

    [[TTNavigator navigator] setCustomTarget:self];
    [[TTNavigator navigator] setCustomAction:@selector(photoAction)];


- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

    if (toInterfaceOrientation == UIDeviceOrientationLandscapeLeft || toInterfaceOrientation == UIDeviceOrientationLandscapeRight)
    
        self.view = self.landscapeView;
    
    else 
    
        self.view = self.portraitView;
    


-(void) orientationChanged:(NSNotification *)object

    UIDeviceOrientation deviceOrientation = [[object object] orientation];

    if (deviceOrientation == UIDeviceOrientationLandscapeLeft || deviceOrientation == UIDeviceOrientationLandscapeRight)
    
        self.view = self.landscapeView;
    
    else 
    
        self.view = self.portraitView;
    

【问题讨论】:

删除所有[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:@"UIDeviceOrientationDidChangeNotification" object:nil]; 的东西和完整的-(void) orientationChanged:(NSNotification *)object 函数。使用 UIInterfaceOrientationLandscapeLeft 和 UIInterfaceOrientationLandscapeRight Additional 只是为了检查函数是否按预期工作 更改 if 语句中的颜色而不是设置另一个 UIView。 我运气不好。我按照解释设置它并在orientationChanged函数中输入断点,它没有被调用。 删除该死的orientationChanged:你不需要它!!!!只需使用- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) self.view = self.landscapeView; else self.view = self.portraitView; 这不起作用。以前,视图至少改变了,现在它不起作用了。 【参考方案1】:

我建议将您的代码放入:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

而不是制作新方法。如果 shouldAutorotateToInterfaceOrientation 方法为该旋转返回 YES,这将被自动调用。

UIDeviceOrientation 和 UIInterfaceOrientation 之间也有区别,因此请确保您引用的是正确的。您现有的代码将更改为以下内容:

if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)

    self.view = self.landscapeView;

else 

    self.view = self.portraitView;

您还可以使用宏来检查界面方向,从而保持代码更简洁。

if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) 

    self.view = self.landscapeView;

else 

    self.view = self.portraitView;

【讨论】:

我应该使用UIDeviceOrientation还是UIInterfaceOrientation 您应该使用 UIInterfaceOrientation 因为如果您的应用仅在纵向模式下运行(例如)并且用户将他们的设备旋转到横向模式,那么现在该应用仍然看起来像在纵向模式中并且只是被搁置一边,当您检查 UIDeviceOrientation 时,它将处于横向状态,因为设备已旋转,但是当您检查 UIInterfaceOrientation 时,它将读取为纵向,因为应用程序本身没有旋转。这有意义吗?还有更多细节 -> ***.com/questions/6838706/iphone-screen-rotation 这很有道理,谢谢。但是,如何将应用设置为随设备旋转? 好问题。我也想不通 要将应用设置为旋转,您需要 (1) 在应用的“摘要”选项卡下选择“支持的设备方向”(请参阅​​ Gopal Nair 在此页面上发布的图片)和( 2)您需要返回YES;在 -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 方法中,用于您想要支持该 ViewController 的任何方向(注意:每个视图控制器可以支持不同的设备方向)。【参考方案2】:

您能否确定,您选择了所有方向支持,如下所示。我试过这个,它似乎对我来说工作得很好。

【讨论】:

是的,所有支持的设备方向框都已选中。【参考方案3】:

你最好简单地使用

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

 if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
    
        self.view = self.landscapeView;
    
    else 
    
        self.view = self.portraitView;
    

处理旋转而不是创建自己的旋转。 现在您可以删除所有通知内容。

【讨论】:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:@"UIDeviceOrientationDidChangeNotification" object:nil]; 这是你的想法吗?这对我不起作用。感谢您的帮助 上述代码的问题在于 UIDeviceOrientation 和 UIInterfaceOrientation 是不同的,因此您正在检查 toInterfaceOrientation == a UIDeviceOrientation 并且它们永远不会。这是有关差异的更多信息 - ***.com/questions/6838706/iphone-screen-rotation 这是一个超级简单的错字,不会引起任何警告/错误,所以它甚至更狡猾。 以前没吃过,所以没考虑。但现在有你的问题;)【参考方案4】:

想法!!!

如果您在界面构建器中设置视图,然后切换视图旋转时显示的实际视图,那么您需要在该特定方向构建该视图,而不仅仅是调整其大小以适应方向。

要检查这个:

在 Interface Builder 中打开您的 .xib。 单击对象下的“视图”,以便选择整个视图。 在 IB 右侧的“模拟指标”下查看。确保在“方向”下拉菜单中选择了“横向”。

如果您的视图为您想要表示您的横向视图的视图显示“纵向”,则可能是 xcode 正在将您的横向视图旋转为纵向并弄乱您的演示文稿。

如果这有帮助,请告诉我。

【讨论】:

再次感谢您的一贯帮助,非常感谢。纵向视图设置为纵向,横向视图设置为横向。 该死的我以为我有东西。【参考方案5】:

嘿,谢谢大家的帮助。我有一个朋友的帮助,我不完全确定问题所在。我可以告诉你我知道他做过的事情。

    暂时停用我们的广告

    完全删除了第二个视图并使用原生方向和调整大小

    几乎每个 .m 文件都添加了这个。

    -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation     
    return YES;
    

    还以编程方式更改了与此类似的其他一些视图

    -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
    
         if (interfaceOrientation == UIDeviceOrientationLandscapeLeft || interfaceOrientation == UIDeviceOrientationLandscapeRight)
         
              if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) 
                       
                   self.Button.frame = CGRectMake(27,96,86,86);
                   self.Label.frame  = CGRectMake(27,162,86,21);
              
             else 
             
                   self.Button.frame = CGRectMake(18,100,86,86);
                   self.Label.frame  = CGRectMake(18,164,86,21);
              
         
      
    

抱歉,我无法完全解释答案,我不完全理解项目中包含的影响方向的所有内容。我对 iOS 开发还是很陌生。

【讨论】:

以上是关于iPad/iPhone 方向问题的主要内容,如果未能解决你的问题,请参考以下文章

iPad/iPhone 方向上的 window.scrollTo

css 移动网站(iPad,iPhone)的“锁定”方向

iPhone 上的景观方向无法正常工作

iPad和iPhone开发的异同

iPad和iPhone的方向:当我单击第二个视图并旋转然后切换回第一个视图时,我的控件没有重新定位

UIImageView 根据方向使用不同的图像