自定义 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 未收到有关设备旋转的方向更改通知的主要内容,如果未能解决你的问题,请参考以下文章