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

NSLayoutConstraint 后子视图中的 UIButton 未收到触摸

UICollectionView 未使用自定义 UIViewController 更新

关闭一个自定义弹出窗口UIViewController并立即显示另一个自定义弹出窗口UIViewController -SWIFT

UIViewController 的视图未由 viewWillAppear() 调整大小 [重复]

UINavigationController 的自定义动画推送未正确呈现导航栏

UISearchBar 移动到屏幕顶部时未收到触摸