iPad键盘出现方向错误

时间:2010-07-09 16:18:05

标签: objective-c cocoa-touch xcode ipad

我有一个splitView应用程序,它有一个rootViewController和DetailsViewController 当应用程序加载detailsViewController弹出一个包含UINavigationBar的Modal viewController。

UINavigationBar上有一个搜索栏(以编程方式设置)。当焦点进入搜索栏时,键盘会弹出。

但是,根据设备(模拟器)的方向,键盘会以错误的方向弹出。键盘始终显示为ipad处于“正常”方向(即主键所在的一侧)

我在所有的shouldAutoRotate方法中返回 YES

  - (BOOL)shouldAutorotateToInterfaceOrientation:
(UIInterfaceOrientation)interfaceOrientation;

为了尝试找出发生了什么,我每次向每个类添加一些调试代码,以便在每次触发shouldAutorotate事件时记录interfaceOrientation,同时还显示模式viewDidLoad方法何时触发。我对每个方向进行了测试:调试输出如下所示。

调试显示,无论实际的设备方向如何,rootViewController和DetailsViewController接口方向始终为Portrait

唯一正确的日志(其中接口方向=设备方向)是每次测试中模拟shouldAutorotate事件的第一个和最后一个(第三个)时间。

如果我在应用程序启动后旋转iPad,则键盘将以正确的方向显示。

任何人都可以阐明为什么会发生这种情况以及如何避免它?

  

[PORTRAIT]

     

主页按钮位置:底部
  键盘出现:底部

     

DEBUG:

     

APP DELEGATE- ADD SPLITVIEWCONTROLLER
  细节 - 界面肖像
  ROOT-Interface Portrait
  ROOT-Interface Portrait
  细节 - 界面肖像
  MODAL-界面肖像
  模态负载
  MODAL-ROTATE START
  MODAL-ROTATE结束
  MODAL-Interface Portrait

     

[风景]

     

主页按钮位置:左侧   键盘出现:左

     

DEBUG:

     

APP DELEGATE- ADD SPLITVIEWCONTROLLER
  细节 - 界面肖像
  ROOT-Interface Portrait
  ROOT-Interface Portrait
  细节 - 界面肖像
  MODAL-Interface LANDSCAPE
  模态负载
  MODAL-ROTATE START
  MODAL-ROTATE结束
  MODAL-界面肖像
  MODAL-Interface LANDSCAPE

     

[PORTRAIT]

     

主页按钮位置:顶部
  键盘出现:顶部

     

DEBUG:

     

APP DELEGATE- ADD SPLITVIEWCONTROLLER
  细节 - 界面肖像
  ROOT-Interface Portrait
  ROOT-Interface Portrait
  细节 - 界面肖像
  MODAL-界面肖像
  模态负载
  MODAL-ROTATE START
  MODAL-ROTATE结束
  MODAL-界面肖像
  MODAL-Interface Portrait

     

[风景]

     

主页按钮位置:右侧   键盘出现:右键

     

DEBUG:

     

APP DELEGATE- ADD SPLITVIEWCONTROLLER
  细节 - 界面肖像
  ROOT-Interface Portrait
  ROOT-Interface Portrait
  细节 - 界面肖像
  MODAL-Interface LANDSCAPE
  模态负载
  MODAL-ROTATE START
  MODAL-ROTATE结束
  MODAL-界面肖像
  MODAL-Interface LANDSCAPE

2 个答案:

答案 0 :(得分:4)

在呈现模态视图控制器之前,您需要让iOS处理旋转事件。

以下是发生的事情:

  1. 该应用已启动。
  2. 根据设备的方向,屏幕旋转事件将排队等待现有的视图控制器。
  3. 在屏幕旋转出现之前,将使用视图控制器中的现有方向创建新的视图控制器。
  4. 处理屏幕旋转事件。
  5. 您的新视图控制器以错误的方向动画存在。
  6. 这基本上是UIKit的竞争条件。其中一些细节是推测,但效果显而易见。

    幸运的是,非常容易来修复。

    不要直接创建新视图,而是将其安排在主队列上进行处理。它将在调度当前事件后完成,包括旋转事件。

    电流:

    [self presentModalViewController:newViewController animated:YES];
    

    修正:

    dispatch_async(dispatch_get_main_queue(), ^{
        [self presentModalViewController:newViewController animated:YES];
    });
    

    使用这个新代码,您将获得此序列:

    1. 该应用已启动。
    2. 根据设备的方向,屏幕旋转事件将排队等待现有的视图控制器。
    3. 在出现屏幕旋转之前,创建新视图控制器的代码已排队但未执行。
    4. 处理屏幕旋转事件。
    5. 您的新视图控制器是使用视图控制器中的正确方向创建的。
    6. 您的新视图控制器会以正确的方向进行动画制作。

答案 1 :(得分:0)