Xamarin表单在iOS上强制页面特定方向

wmvff8tz  于 2023-01-18  发布在  iOS
关注(0)|答案(1)|浏览(133)

我的XF应用程序中有几个页面需要根据显示的内容显示为纵向或横向。在Android上,这没有问题,在iOS 16发布之前也从来没有问题。
iOS 16显然删除了使用UIDevice UIInterfaceOrientation方法的功能,如下图所示,该方法位于我的AppDelegate中。

MessagingCenter.Subscribe<MainPage>(this, "SetLandscapeModeOff", sender =>
            {
                UIDevice.CurrentDevice.SetValueForKey(new NSNumber((int)UIInterfaceOrientation.Portrait), new NSString("orientation"));
            });

这样做效果很好,我可以简单地在我试图以特定方向加载的页面上的OnAppearing方法中调用下面的代码。

MessagingCenter.Send(this, "SetLandscapeModeOff");

我在这里看到过一两篇关于新方法的帖子(还有很多关于iOS 16之前的方法),但没有一篇完整到足以让我这样的技术水平的人理解如何实现它们。除了上面的帖子,我没有任何起点。
提前感谢您的帮助!

tkclm6bt

tkclm6bt1#

在iOS16中更改页面的方式已经改变,可以使用DependencyService来实现,参考以下代码:
在表单中创建界面:

public interface InterfaceOrientationService    {        
void SetLandscape();        
void SetPortrait();    
}

iOS项目:

using Foundation;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using UIKit;
using Xamarin.Forms;
using XamarinFormsOne;
using XamarinFormsOne.iOS;

[assembly: Xamarin.Forms.Dependency(typeof(InterfaceOrientationServiceiOS))]   
namespace XamarinFormsOne.iOS    
{
    public class InterfaceOrientationServiceiOS: InterfaceOrientationService 
    {
        public InterfaceOrientationServiceiOS() { }

        public void SetLandscape() {
            if (UIDevice.CurrentDevice.CheckSystemVersion(16, 0))    
            {    
                var windowScene = (UIApplication.SharedApplication.ConnectedScenes.ToArray()[0] as UIWindowScene);

                if (windowScene != null)    
                {    
                    var nav = UIApplication.SharedApplication.KeyWindow?.RootViewController;   
                    if (nav != null)  
                    {
                   nav.SetNeedsUpdateOfSupportedInterfaceOrientations();   
                        windowScene.RequestGeometryUpdate( 
                            new UIWindowSceneGeometryPreferencesIOS(UIInterfaceOrientationMask.Portrait),
                            error => { }    
                        );
                    }
               }
            }
            else
            {
                UIDevice.CurrentDevice.SetValueForKey(new NSNumber((int)UIInterfaceOrientation.Portrait), new NSString("orientation"));
            }
        }
            public void SetPortrait() {
    
                if (UIDevice.CurrentDevice.CheckSystemVersion(16, 0))
                {
                    var windowScene = (UIApplication.SharedApplication.ConnectedScenes.ToArray()[0] as UIWindowScene);
                    if (windowScene != null)
                    {
                        var nav = UIApplication.SharedApplication.KeyWindow?.RootViewController;
                        if (nav != null)
                        {
                       nav.SetNeedsUpdateOfSupportedInterfaceOrientations();
                            windowScene.RequestGeometryUpdate(
                                new UIWindowSceneGeometryPreferencesIOS(UIInterfaceOrientationMask.Portrait),
                                error => { }
                            );
                        }
                    }
                }
                else
                {
                    UIDevice.CurrentDevice.SetValueForKey(new NSNumber((int)UIInterfaceOrientation.Portrait), new NSString("orientation"));
                }
            }
        }
    }

调用Xamrin中的接口。窗体:

protected override void OnAppearing()        
{            
base.OnAppearing();            
//SetLandscape            
DependencyService.Get<InterfaceOrientationService().SetLandscape();            
//SetPortrait            
DependencyService.Get<InterfaceOrientationService>().SetPortrait();        
}

相关问题