我正在尝试按照标准方法创建自定义UINavigationBar以更改其背景图像,但在子类化过程中发现了一个问题。如果我将UINavigationController子类化,旨在覆盖虚拟NavigationBar属性以提供我自己的实现,则所有导航项(任何左或右按钮和标题视图)都会消失。起初我认为这是由于背景在导航项的顶部呈现,但我可以用no-op子类重现问题。
使用以下代码可以重现:
[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);
// ...
答案 0 :(得分:1)
好吧,你的SetNavigationBar()方法没有将它传递给本机基类,并且由于你自己没有做任何显式绘图,如何为你的自定义NavigationBar类调用本机绘图代码?
在您的示例代码中,NavigationBar只是在空间中浮动,永远不会被告知绘制。
答案 1 :(得分:1)
为了子类化UINavigationBar,必须在派生类中定义IntPtr构造函数,并使用公共UINavigationController(Type navigationBarType,Type toolbarType)构造函数实例化UINavigationController。例如:
public class MyNavigationBar: UINavigationBar
{
public MyNavigationBar(IntPtr h) : base(h)
{
}
// Do something.
}
....
var navController = new UINavigationController(typeof(MyNavigationBar), typeof(UIToolbar));
我花了一些时间才弄明白。有关此页面的更多信息:http://developer.xamarin.com/guides/ios/platform_features/introduction_to_ios_6/在Subclassing UINavigationBar。
部分答案 2 :(得分:0)
您是否可以创建一个示例项目,将NavigationItems直接添加到UINavigationController,然后使用子类UINavigationController / UINavigationBar使这些按钮消失?
谢谢,
ChrisNTR
答案 3 :(得分:0)
经过大量的研究和来回与Xamarin,这个问题的答案是你必须使用一个基本上没有操作的IB存根文件,但存在为您的导航元素穿梭所需的基本类型。我的OSS项目有一个工作示例:http://github.com/danielcrenna/artapp