自定义 UIViewController 未收到有关设备旋转的方向更改通知
Posted
技术标签:
【中文标题】自定义 UIViewController 未收到有关设备旋转的方向更改通知【英文标题】:Custom UIViewController not receiving orientation change notifications on device rotation 【发布时间】:2012-11-21 16:48:45 【问题描述】:所以,我有一个自定义 UIWindow、一个自定义 UIViewController 和一个自定义 UIImageView。
private class CoachingWindow : UIWindow
public CoachingWindow(...)
RootViewController = new CoachingOverlayViewController(...);
private class CoachingOverlayViewController : UIViewController
public CoachingOverlayViewController(...)
View = new CoachingOverlayView(...);
public override void DidRotate (UIInterfaceOrientation fromInterfaceOrientation)
...
public override bool ShouldAutorotate()
return true;
private class CoachingOverlayView : UIImageView
public CoachingOverlayView(...)
...
第一次调用时,窗口、视图控制器和视图都正确显示:自定义 UIWindow 显示为现有 UIWindows 其余部分的覆盖,视图控制器被正确分配为 RootViewController,视图被分配给视图视图控制器的属性。所以,这一切都正确呈现。
但是,当我物理旋转设备或模拟器时,被覆盖的 DidRotate() 和 ShouldAutorotate() 方法永远不会被调用。
我认为这可能与我使用自定义 UIWindow 的事实有关。也许窗口没有收到来自 ios 的方向更改通知?还是 iOS 将这些通知直接发送到视图控制器?也许我必须以某种方式让视图控制器订阅这些事件,因为它是一个自定义视图控制器???
我正在使用 MonoTouch 和 iOS 6。
任何建议都会很棒。我在这里撞墙了。
【问题讨论】:
你试过 -(void)viewWillAppear:(BOOL)animated 吗? 【参考方案1】:在 iOS 6 中你可以使用
public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations()
...
【讨论】:
【参考方案2】:想通了。我已经覆盖了 ShouldAutorotateToInterfaceOrientation (UIInterfaceOrientation toInterfaceOrientation) 而不是 ShouldAutorotate()。但这实际上在 iOS6 中已被弃用。仍然需要弄清楚如何以 iOS6 的方式进行操作,但现在就可以了。
public override bool ShouldAutorotateToInterfaceOrientation (UIInterfaceOrientation toInterfaceOrientation)
...
【讨论】:
您是否支持 iOS6 only 设备?如果是这样,那么您可以随时停止使用已弃用的方法(或直到 Apple 删除它们,请记住仍有可用的方法在 iOS 2.0 中已弃用)。 OTOH,如果您支持使用 iOS 5.x(或更早版本)的人,请继续使用现有的(它仍然存在并在 iOS6 中工作)方法。在某些情况下,替换方法可以提供一些优势,您可能希望在同一个应用程序中同时支持(旧的和新的)代码路径(以获得每个 iOS 版本的最佳体验),但这并不常见。 此版本要求我支持 iOS 5。 然后 try 避免在 iOS 4.3(及更早)版本中弃用 API,因为这将使您的代码的未来维护更容易。 不要使用 iOS 6.0 中引入的 API,即使它在 5.0 中弃用了 API(除非您有 iOS5 的后备代码并且准备好测试两个代码路径)。以上是关于自定义 UIViewController 未收到有关设备旋转的方向更改通知的主要内容,如果未能解决你的问题,请参考以下文章