【问题标题】:Custom UIViewController not receiving orientation change notifications on device rotation自定义 UIViewController 未收到有关设备旋转的方向更改通知
【发布时间】: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 吗?

标签: ios uiviewcontroller xamarin.ios


【解决方案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 的后备代码并且准备好测试两个代码路径)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多