Xamarin iOS UINavigationBar 奇怪的覆盖

Posted

技术标签:

【中文标题】Xamarin iOS UINavigationBar 奇怪的覆盖【英文标题】:Xamarin iOS UINavigationBar weird overlay 【发布时间】:2020-08-02 19:42:52 【问题描述】:

我在 Xamarin 4.5 和 ios 13 中工作。我正在使用模拟器运行代码。这是它的外观。

我添加了以下代码来应用红色,但它没有隐藏这个白色/灰色叠加层。

UIApplication.SharedApplication.StatusBarStyle = UIStatusBarStyle.LightContent;
UINavigationBar.Appearance.BarTintColor = UIColor.Red;
UINavigationBar.Appearance.TintColor = UIColor.Red;
UINavigationBar.Appearance.TitleTextAttributes = new UIStringAttributes

    ForegroundColor = UIColor.Red
;

UINavigationBar.Appearance.BackgroundColor = UIColor.FromRGBA(255, 0, 0, 255);

最后一行添加了红色。

【问题讨论】:

@LucasZhang-MSFT 请停止重复评论,一旦我测试它,我会接受你的回答 好的,不管它是否有效,请告诉我结果:) @LucasZhang-MSFT 我将 Xamarin 表单从 4.5 更新到 4.6.x 并解决了这个问题,在更新之前我注意到它只发生在 iPhone 10、11 中。我认为它与额外的填充物或安全区域 【参考方案1】:

这将是一个预期的效果,因为 UINavigationBar 在 iOS 11.0 之后有一个默认的CALayer。作为一种解决方法,我们可以使用自定义渲染器创建自定义 NavigationBar

在您的 iOS 项目中


using Foundation;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

using xxx;
using xxx.iOS;
using CoreGraphics;
using ObjCRuntime;
[assembly:ExportRenderer(typeof(ContentPage),typeof(MyPageRenderer))]

namespace xxx.iOS

    public  class MyPageRenderer:PageRenderer
    
        public override void ViewWillAppear(bool animated)
        
            base.ViewWillAppear(animated);



            NavigationController.NavigationBar.Hidden = true;


            double height = IsiphoneX();

            UIView backView = new UIView()
            
                BackgroundColor = UIColor.Red,
                Frame = new CGRect(0, 20, UIScreen.MainScreen.Bounds.Width, height),

            ;

            // set 
            UIButton backBtn = new UIButton()
            

                Frame = new CGRect(20, height - 44, 40, 44),
                Font = UIFont.SystemFontOfSize(18),

            ;

            backBtn.SetTitle("<",UIControlState.Normal);
            backBtn.SetTitleColor(UIColor.White,UIControlState.Normal);
            backBtn.AddTarget(this, new Selector("GoBack"), UIControlEvent.TouchUpInside);

            UILabel titleLabel = new UILabel()
            
                Frame = new CGRect(UIScreen.MainScreen.Bounds.Width / 2 - 75, 0, 150, height),
                Font = UIFont.SystemFontOfSize(20),
                Text = "xxx",
                TextColor = UIColor.White,
                Lines = 0,

            ;

            UILabel line = new UILabel()
            

                Frame = new CGRect(0, height, UIScreen.MainScreen.Bounds.Width, 0.5),
                BackgroundColor = UIColor.Black,

            ;


            if (NavigationController.ViewControllers.Length > 1)
            
                backView.AddSubview(backBtn);
            

            backView.AddSubview(titleLabel);
            backView.AddSubview(line);

            View.AddSubview(backView);
        


        double IsiphoneX()
        

            double height = 44;

            if (UIDevice.CurrentDevice.CheckSystemVersion(11, 0))
            
                if (UIApplication.SharedApplication.Delegate.GetWindow().SafeAreaInsets.Bottom > 0.0)
                
                    height = 64;
                
            

            return height;
        

        [Export("GoBack")]
        void GoBack()
        
            NavigationController.PopViewController(true);
        

        public override void ViewWillDisappear(bool animated)
        
            base.ViewWillDisappear(animated);

            NavigationController.NavigationBar.Hidden = false;
        
    

您可以根据需要设置 title , backButton 和 navigationBar 的属性(例如 text , color ,BackgroundColor ,font e.g.)

【讨论】:

以上是关于Xamarin iOS UINavigationBar 奇怪的覆盖的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.forms(或)xamarin.ios/xamarin.android(或)本机

Xamarin SQLite教程Xamarin.iOS项目添加引用

Xamarin.Forms 是 Xamarin.Android、Xamarin.IoS 和 Xamarin.Win 的简单总和吗?

使用Xamarin Effect删除Xamarin.iOS中TextEntry上的圆角

Xamarin.iOS 和 RFComm

Xamarin.IOS 和 Signalr 推送通知