1

我幾個月來一直在使用Xamarin,並且偶爾會遇到一些麻煩。我正在使用自定義渲染器來更改我的選項卡的外觀。在不同標籤之間切換時,它工作得很好。然而,當我瀏覽到我的tabbedPage使用:Xamarin.ios的CustomTabRenderer

Children.Add(new UnitMapPage { Title = "Map", Icon = "map.png" }); 
CurrentPage = mapPage; 

頁打開正確的選項卡上,但TabbarItem的文字看起來酷似非選擇項目。只要你點擊任何標籤,它就會變成正確的樣式。這是我的自定義渲染器。

class CustomTabRenderer : TabbedRenderer 
{ 
    private UnitViewModel _unitViewModel; 
    private TabbedPage _unitPage; 

    protected override void OnElementChanged(VisualElementChangedEventArgs e) 
    { 
     base.OnElementChanged(e); 

     if (e.NewElement != null) { 
      var unitPage = (TabbedPage)e.NewElement; 
      _unitPage = unitPage; 
      _unitViewModel = (UnitViewModel)_unitPage.BindingContext; 
      _unitViewModel.PropertyChanged += OnElementPropertyChanged; 
     } 

     // Set Text Font for unselected tab states 
     UITextAttributes normalTextAttributes = new UITextAttributes(); 
     normalTextAttributes.Font = UIFont.SystemFontOfSize(10.0F, UIFontWeight.Regular); // unselected 
     normalTextAttributes.TextColor = UIColor.White; 

     UITabBarItem.Appearance.SetTitleTextAttributes(normalTextAttributes, UIControlState.Normal); 
    } 

    void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
    { 
     if (e.PropertyName == "AlertCount") 
     { 
      if (TabBar.Items != null) 
      { 
       foreach (var item in TabBar.Items) 
       { 
        item.Image = item.Image.ImageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal); 
        if (item.Title == "History" && _unitViewModel != null) 
        { 
         if (_unitViewModel.AlertCount > 0) 
          item.BadgeValue = _unitViewModel.AlertCount.ToString(); 
         else 
          item.BadgeValue = null; 
        } 
       } 
      } 
     } 
    } 

    public override void ViewWillAppear(bool animated) 
    { 
     if (TabBar.Items != null) 
     { 
      foreach (var item in TabBar.Items) 
      { 
       item.Image = item.Image.ImageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal); 
       if (item.Title == "History" && _unitViewModel != null) 
       { 
        if (_unitViewModel.AlertCount > 0) 
         item.BadgeValue = _unitViewModel.AlertCount.ToString(); 
        else 
         item.BadgeValue = null; 
       } 
      } 
     } 
     base.ViewWillAppear(animated); 
    } 

    public override UIViewController SelectedViewController 
    { 
     get 
     { 
      UITextAttributes selectedTextAttributes = new UITextAttributes(); 
      selectedTextAttributes.Font = UIFont.SystemFontOfSize(12.0F, UIFontWeight.Heavy); // SELECTED 
      if (base.SelectedViewController != null) 
      { 
       base.SelectedViewController.TabBarItem.SetTitleTextAttributes(selectedTextAttributes, UIControlState.Normal); 
      } 
      return base.SelectedViewController; 
     } 
     set 
     { 
      base.SelectedViewController = value; 

      foreach (UIViewController viewController in base.ViewControllers) 
      { 
       UITextAttributes normalTextAttributes = new UITextAttributes(); 
       normalTextAttributes.Font = UIFont.SystemFontOfSize(10.0F, UIFontWeight.Regular); // unselected 
       normalTextAttributes.TextColor = UIColor.White; 

       viewController.TabBarItem.SetTitleTextAttributes(normalTextAttributes, UIControlState.Normal); 
      } 
     } 
    } 
} 

回答

0

問題似乎當我升級我從ios9檢測到ios10設備已經悄悄(無法確認這一點,因爲我無法找到可以測試的ios9設備)。

通過對這篇文章的回答:How do I override the Xamarin Forms TabbedPage item fonts for iOS?,讓我嘗試了各種各樣的東西在我自己的ViewWillAppear

該問題已通過更改我的代碼以在我的ViewWillAppear中設置selectedTextAttributes來解決。不知道這是否是最好的辦法,但它做到了!

public override void ViewWillAppear(bool animated) 
    { 
     if (TabBar.Items != null) 
     { 
      foreach (var item in TabBar.Items) 
      { 
       item.Image = item.Image.ImageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal); 
       if (item.Title == "History" && _unitViewModel != null) 
       { 
        if (_unitViewModel.AlertCount > 0) 
         item.BadgeValue = _unitViewModel.AlertCount.ToString(); 
        else 
         item.BadgeValue = null; 
       } 

       if (item.Title.Equals(_unitPage.CurrentPage.Title)) 
       { 
        UITextAttributes selectedTextAttributes = new UITextAttributes(); 
        selectedTextAttributes.Font = UIFont.SystemFontOfSize(12.0F, UIFontWeight.Heavy); // SELECTED 
        if (base.SelectedViewController != null) 
        { 
         base.SelectedViewController.TabBarItem.SetTitleTextAttributes(selectedTextAttributes, UIControlState.Normal); 
        } 
       } 
      } 
     } 
     base.ViewWillAppear(animated); 
    } 
0

我相信,你只需要更換:

CurrentPage = yourPage; 

SelectedItem = yourPage; 
+0

我試過這個,也是在我的自定義渲染器中,但它給了我相同的結果。當我刪除item.Image = item.Image.ImageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal); mapPage圖標是白色的,而另一個是灰色的(表示它被設置爲SelectedIcon),但文本大小與未選中的相同 – Valkyrie