【问题标题】:Determine Which Landscape mode to set Xamarin.iOS确定要设置 Xamarin.iOS 的横向模式
【发布时间】:2018-04-05 08:37:14
【问题描述】:

在 Xamarin.Forms 中,我使用依赖服务,通过使用下面的代码强制屏幕在横向模式下定向。

UIDevice.CurrentDevice.SetValueForKey(new NSNumber((int)UIInterfaceOrientation.LandscapeLeft), new NSString("orientation"));

但是如何确定是横向右还是横向左

更新 当用户将设备保持在横向右侧并想要锁定横向方向时,设备将锁定在横向左侧。那么如何智能找到将其锁定在哪个位置呢?如果我将其锁定在横向左侧,则当用户将其锁定在横向右侧时它将无法工作,反之亦然。

Found this,相当于这会工作,但不知道如何在 Xamarin.iOS 中做到这一点

【问题讨论】:

  • 你已经设置为UIInterfaceOrientation.LandscapeLeft,请问如何判断是横向右还是横向左?
  • 当用户以横向右握持设备并希望在横向锁定方向时,设备被锁定在横向左。那么如何智能找到将其锁定在哪个位置呢?如果我将其锁定在横向左侧,则当用户将其锁定在横向右侧时它将不起作用,反之亦然。
  • 在下面查看我的答案。

标签: c# xamarin.ios xamarin.forms


【解决方案1】:

在锁定方向之前,您可以在iOS平台根据StatusBarOrientation检测设备方向。然后您可以根据用户当前的方向锁定方向。

    var currentOrientation = UIApplication.SharedApplication.StatusBarOrientation;

    if (currentOrientation == UIInterfaceOrientation.LandscapeLeft)
    {
        //YOUR CODE
    }
    else if (currentOrientation == UIInterfaceOrientation.LandscapeRight)
    {
        //YOUR CODE
    }

参考:Checking Device Orientation

更新

当屏幕方向被锁定时,您需要一个旧但有用的工具来检测方向。它是Core Motion。例如,您可以这样使用它:

        public void LockOrientation()
        {
            CMMotionManager CMManager = new CMMotionManager();
            CMManager.DeviceMotionUpdateInterval = 0.2f;
            CMManager.StartDeviceMotionUpdates(NSOperationQueue.MainQueue, (motion, error) => {
                if (Math.Abs(motion.Gravity.X) > Math.Abs(motion.Gravity.Y))
                {
                    Console.WriteLine("Lan");
                    if (motion.Gravity.X > 0)
                    {
                        UIDevice.CurrentDevice.SetValueForKey(new NSNumber((int)UIInterfaceOrientation.LandscapeLeft), new NSString("orientation"));
                        Console.WriteLine("Left");
                    }
                    else
                    {
                        UIDevice.CurrentDevice.SetValueForKey(new NSNumber((int)UIInterfaceOrientation.LandscapeRight), new NSString("orientation"));
                        Console.WriteLine("Right");
                    }
                }
                else
                {
                    if (motion.Gravity.Y >= 0)
                    {
                        Console.WriteLine("Down");
                    }
                    else
                    {
                        Console.WriteLine("UP");
                    }
                }

                CMManager.StopDeviceMotionUpdates();
            });
        }

【讨论】:

  • 已经试过了。 currentOrientation 将始终是纵向的,因为它已经锁定在纵向。
  • 我已经更新了我的答案并提供了锁定方向场景的解决方案。
  • @FemilShajin,我的回答对你有帮助吗?
  • 嘿抱歉,忘记恢复了。不,它没有帮助。只有当我旋转设备时才会收到运动更新。也许我没有正确解释它。应用程序被锁定为纵向,因此用户旋转到横向,然后将其锁定为横向模式(单击开关),因此旋转已经发生,并且当它被锁定在纵向时,动作更新将不会运行。谢谢,但没有用。
  • 你试过了吗?这对我来说可以。用户将锁定的设备从纵向旋转到横向后,用户可以点击一个按钮触发我提供的方法,屏幕将锁定在当前状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多