2011-09-12 63 views
3

我試圖按照標準方法創建自定義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); 

// ... 

回答

0

了大量的研究和來回Xamarin後,回答這個問題是你必須使用一個IB存根文件實質上是空操作,但存在爲您的導航元素穿梭所需的基礎類型。在我的OSS項目中有一個工作示例:http://github.com/danielcrenna/artapp

1

好,您的SetNavigationBar()方法不會將其傳遞給本地基類,因爲您自己不做任何明確的繪製,本機繪圖代碼應該如何針對您的自定義NavigationBar類調用?

在您的示例代碼中,NavigationBar僅在空間中浮動,並且永遠不會被告知繪製。

+0

問題是基類中的UINavigationBar是不可設置的。 iOS中的標準方法是子類化,使用類別或調用ObjC運行時在運行時交換實現。沒有辦法將任何東西「傳遞給基類」。自定義代碼(本例中不是)繪製;只是沒有額外的導航項目。很明顯,我需要一種方法在執行的早期連接我的實現,但似乎並不存在。 –

+0

是的,我錯了。抱歉。導航欄是隱藏的嗎?我不知道還有什麼建議... – jstedfast

+0

導航欄顯示,但不能添加任何導航項目,並且沒有呈現titleView。我找不到任何連貫的方式來基於此定製UINavigationBar,但它在iOS中作爲一個選項免費提供。我應該提交一個錯誤嗎? –

0

您可以創建一個示例項目,您將NavigationItems直接添加到UINavigationController,然後使用子分類的UINavigationController/UINavigationBar導致這些按鈕消失?

感謝,

ChrisNTR

1

爲了繼承UINavigationBar,您必須在派生類中定義IntPtr構造函數,並使用public 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/的子節點UINavigationBar。