我試圖按照標準方法創建自定義UINavigationBar以更改其背景圖像,但在子類過程中發現了問題。如果我繼承了UINavigationController,意圖覆蓋虛擬NavigationBar屬性以提供我自己的實現,所有導航項(任何左側或右側按鈕以及標題視圖)都會消失。起初我以爲這是由於背景被渲染在導航條目之上,但我可以用no-op子類來重現問題。通過子類定義自定義UINavigationB將刪除導航項
它的可重複使用下面的代碼:
[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);
// ...
問題是基類中的UINavigationBar是不可設置的。 iOS中的標準方法是子類化,使用類別或調用ObjC運行時在運行時交換實現。沒有辦法將任何東西「傳遞給基類」。自定義代碼(本例中不是)繪製;只是沒有額外的導航項目。很明顯,我需要一種方法在執行的早期連接我的實現,但似乎並不存在。 –
是的,我錯了。抱歉。導航欄是隱藏的嗎?我不知道還有什麼建議... – jstedfast
導航欄顯示,但不能添加任何導航項目,並且沒有呈現titleView。我找不到任何連貫的方式來基於此定製UINavigationBar,但它在iOS中作爲一個選項免費提供。我應該提交一個錯誤嗎? –