2015-04-10 3 views
12

Есть ли способ указать значок «системы», который будет отображаться на вкладке при использовании форм Xamarin? Я хотел бы использовать значки, такие как «Избранное», «Закладка», «История» и т. Д., Но я не хочу предоставлять все свои собственные изображения для различных платформ.Можно ли использовать значки системы на вкладках в форматах Xamarin?

Использование Xamarin.iOS можно использовать следующий синтаксис:

tab1.TabBarItem = new UITabBarItem (UITabBarSystemItem.Favorites, 0); 

Я могу, однако, не нашел, как это сделать в рамках проекта кросс-платформенных Xamarin.Forms.

Это мой текущий код:

var profilePage = new ContentPage { 
    Title = "Profile", 
    //This requires my own images to be added to the project whereas 
    //I wish to use built-in images which are platform specific for 
    //Favourites, Bookmark, More, etc... 
    //Icon = "Profile.png", 
    Content = new StackLayout { 
     Spacing = 20, Padding = 50, 
     VerticalOptions = LayoutOptions.Center, 
     Children = { 
     new Entry { Placeholder = "Username" }, 
     new Entry { Placeholder = "Password", IsPassword = true }, 
     new Button { 
      Text = "Login", 
      TextColor = Color.White, 
      BackgroundColor = Color.FromHex("77D065") }}}}; 

var settingsPage = new ContentPage { 
    Title = "Settings", 
    Content = new StackLayout { 
     Spacing = 20, Padding = 50, 
     VerticalOptions = LayoutOptions.Center, 
     Children = { 
      new Entry { Placeholder = "Username" }, 
      new Entry { Placeholder = "Password", IsPassword = true }}} 
     }; 


MainPage = new TabbedPage { Children = {profilePage, settingsPage} }; 
+0

вам нужно только IOS или Android тоже? –

+0

Если вы используете значки системы, вы не можете изменить заголовок под ним. Если это проблема, и вы хотите использовать свой собственный заголовок с системными значками, вам нужно будет получить копию изображения. Если вы согласны использовать названия систем, дайте нам знать, и я дам вам ответ. Также вы смешиваете 2 проблемы в одном. Вы хотите использовать кросс-платформенные значки, хранящиеся в значках PCL или системы. Если вы говорите об элементах системы, вы не можете указать, что вместо кода вы показываете, потому что у них разные имена для каждой платформы. Если вы хотите просто держать их в одном месте - это другой вопрос. Пожалуйста, уточните –

+0

Итак, с системными значками вы говорите, что Apple поставляет заголовки, и я не могу их изменить?Если это невозможно, вы думаете, что единственный способ сделать это будет с значками png или есть другие типы значков, которые дают изображения хорошего качества и легко изменяются? Если это возможно, вы могли бы предложить в ответ некоторые источники значков, которые можно было бы использовать и как их можно было бы изменить. – Alan2

ответ

4

Для прошивки

вам нужен пользовательский визуализатор для вашей страницы. В моем примере это класс CustomTabsPage. Вы не можете просто использовать значки системы для создания UIImage. Нам нужно использовать UITabBarItem. Проблема в том, что UITabBarItem не позволяет изменять ни заголовок, ни изображение/значок. Но мы можем скопировать изображение из него.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using UIKit; 
using ButtonRendererDemo; 
using ButtonRendererDemo.iOS; 
using Xamarin.Forms; 
using Xamarin.Forms.Platform.iOS; 

[assembly: ExportRenderer(typeof(CustomTabsPage), typeof(CustomTabsPageRenderer))] 
namespace ButtonRendererDemo.iOS 
{ 
    public class CustomTabsPageRenderer : TabbedRenderer 
    { 

     #region Sytem Image with custom title 

     public override void ViewWillAppear(bool animated) 
     { 
      base.ViewWillAppear(animated); 

      foreach (var item in TabBar.Items) 
      { 
       item.Image = GetTabIcon(item.Title); 
      } 
     } 

     private UIImage GetTabIcon(string title) 
     { 
      UITabBarItem item = null; 

      switch (title) 
      { 
       case "Profile": 
        item = new UITabBarItem(UITabBarSystemItem.Search, 0); 
        break; 
       case "Settings": 
        item = new UITabBarItem(UITabBarSystemItem.Bookmarks, 0); 
        break; 
      } 

      var img = (item != null) ? UIImage.FromImage(item.SelectedImage.CGImage, item.SelectedImage.CurrentScale, item.SelectedImage.Orientation) : new UIImage(); 
      return img; 
     } 

     #endregion 
    } 
} 

enter image description here

для Android

вещи легче

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using ButtonRendererDemo; 
using ButtonRendererDemo.Droid; 
using Xamarin.Forms; 
using Xamarin.Forms.Platform.Android; 
using Xamarin.Forms.Platform.Android.AppCompat; 
using Android.Support.Design.Widget; 

[assembly: ExportRenderer(typeof(CustomTabsPage), typeof(CustomTabsPageRenderer))] 
namespace ButtonRendererDemo.Droid 
{ 
    public class CustomTabsPageRenderer : TabbedPageRenderer 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e) 
     { 
      base.OnElementChanged(e); 

      //var layout = (TabLayout)ViewGroup.GetChildAt(1); //should be enough but just for robustness we use loop below 

      TabLayout layout = null; 
      for (int i = 0; i < ChildCount; i++) 
      { 
       layout = GetChildAt(i) as TabLayout; 
       if (layout != null) 
        break; 
      } 
      if (layout != null) 
      { 
       for (int tabIndex = 0; tabIndex < layout.TabCount; tabIndex++) 
        SetTabIcon(layout, tabIndex); 
      } 
     } 

     private void SetTabIcon(TabLayout layout, int tabIndex) 
     { 
      var tab = layout.GetTabAt(tabIndex); 

      switch (tabIndex) 
      { 
       case 0: 
        tab.SetIcon(Resource.Drawable.icon2);//from local resource 
        break; 
       case 1: 
        tab.SetIcon(Resource.Drawable.ic_media_play_dark);//from Android system, depends on version ! 
        break; 
      } 
     } 
    } 

} 

enter image description here

+0

Спасибо, это работает хорошо. Можете ли вы сказать мне, что вам удалось найти список всех доступных значков. Я посмотрел, но не нашел полного списка. Спасибо – Alan2

+0

Перейдите к определению перечисления, как UITabBarSystemItem, и вы увидите все их для табуляции. В другом вопросе я ответил вам, что у вас есть еще 3 перечисления, которые вы можете использовать. Можете ли вы принять ответ? –

+0

Привет, Юрий, ответ будет принят, когда бонус разыгрывается, так как у вас сейчас самая высокая оценка :-). Вы можете подождать некоторое время –

-2

Вы должны написать пользовательские TabbedPage визуализации для проекта IOS:

public class YourTabbedRenderer : TabbedRenderer { 
     public override void ViewWillAppear(bool animated) 
     { 
      base.ViewWillAppear(animated); 
      var items = TabBar.Items; 

      for (var i = 0; i < items.Length; i++) { 
       // set your icons here, you could do some string comparison (check tab title or tab icon resource name) 
       // items[i].Image = 
       // items[i].SelectedImage = 
      } 
     } 
    } 

http://developer.xamarin.com/guides/cross-platform/xamarin-forms/custom-renderer/

0

Для того, чтобы использовать иконки, вам нужно от платформы специфической структуры. В Xamarin.Forms, для этой работы:

Icon = "youricon.png"; 

Понадобится:

  • IOS: поместить изображение в /Resources/youricon.png
  • Android: поместить изображение в/Resources/drawable/youricon.png
  • Win Phone: поместите изображение в корень проекта приложения Windows Phone.
+1

. Невозможно ли отображать системные изображения без включения копии каждого из них? Я думаю, что спрашивающий спрашивает о вещах, таких как значок камеры, которые отличаются даже между разными версиями одной и той же операционной системы. –

+0

Хотя значки зависят от платформы, в зависимости от ваших требований вы можете использовать кросс-платформенные изображения для своей функциональности: https://developer.xamarin.com/guides/xamarin-forms/working-with/images/ –

Смежные вопросы