uinavigationcontroller - 通过子类化定义自定义 UINavigationBar 会删除导航项

标签 uinavigationcontroller xamarin.ios uinavigationbar

我试图遵循标准方法来创建自定义 UINavigationBar 以更改其背景图像,但在子类化过程中发现了问题。如果我子类化 UINavigationController,并打算覆盖虚拟 NavigationBar 属性以提供我自己的实现,则所有导航项(任何左或右按钮以及标题 View )都会消失。起初我以为这是由于背景渲染在导航项之上,但我可以使用无操作子类重现该问题。

可以使用以下代码重现:

[Register("NavigationBar")]
public class NavigationBar : UINavigationBar
{
    public NavigationBar () : base()
    {

    }

    public NavigationBar (NSCoder coder) : base(coder)
    {

    }

    public NavigationBar (IntPtr ptr) : base(ptr)
    {

    }

    public NavigationBar (NSObjectFlag t) : base(t)
    {

    }

    public NavigationBar (RectangleF frame) : base(frame)
    {

    }
}

[Register("NavigationController")]
public class NavigationController : UINavigationController 
{
    private UINavigationBar _navBar;

    public NavigationController () : base()
    {

    }

    public NavigationController (NSCoder coder) : base(coder)
    {

    }

    public NavigationController (IntPtr ptr) : base(ptr)
    {

    }

    public NavigationController (NSObjectFlag t) : base(t)
    {

    }

    public override UINavigationBar NavigationBar
    {
        get
        {
            if(_navBar == null) 
            {
                return base.NavigationBar;
            }

            return _navBar;
        }
    }

    public void SetNavigationBar(UINavigationBar navigationBar)
    {
        _navBar = (UINavigationBar)navigationBar;
    }
}

现在,要丢失导航项,您所需要做的就是使用自定义类而不是默认类:

var navigationBar = new NavigationBar();
navigationBar.BarStyle = UIBarStyle.Black;
navigationBar.TintColor = HeaderColor;

var navigationController = new NavigationController();
navigationController.SetNavigationBar(navigationBar);

// ...

最佳答案

好吧,您的 SetNavigationBar() 方法不会将其传递给 native 基类,并且由于您自己不执行任何显式绘制,因此应该如何为您的自定义 NavigationBar 类调用 native 绘制代码?

在您的示例代码中,导航栏只是漂浮在空间中,并且永远不会被告知进行绘制。

关于uinavigationcontroller - 通过子类化定义自定义 UINavigationBar 会删除导航项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7392139/

相关文章:

ios - (Xamarin iOS) : ExecutionEngineException - Attempting to JIT compile method while running in aot-only mode

c# - 使用单点触控将多页文本绘制为 pdf

ios - 如何设置状态栏和导航栏之间的空间?

ios - 无法在 View Controller 中看到标签

ios - 如何在导航堆栈中插入一个新的 View Controller 然后弹出它?

cocoa-touch - iOS导航栏更喜欢大标题滚动行为

Xamarin.iOS 运行时绑定(bind)项目错误

ios - 如何更改状态栏的背景颜色而不是导航栏的背景颜色?

ios - iphone 6 的自定义导航栏图像

ios - 呈现 viewController 时出现问题