我试图遵循标准方法来创建自定义 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/