コメント
コメントの投稿
※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。
入力されていないコメントには返信しませんのであらかじめご了承くださいませ。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Input;
using UIKit;
using CoreGraphics;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using AppName.iOS.Renderer;
[assembly: ExportRenderer(typeof(Page), typeof(CustomPageRenderer))]
namespace AppName.iOS.Renderer
{
public class CustomPageRenderer : PageRenderer
{
List<ToolbarItem> _primaryItems;
readonly Dictionary<UIButton, ICommand> _buttonPrimaryCommands = new Dictionary<UIButton, ICommand>();
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
var page = e.NewElement as Page;
if (page != null)
{
//プライマリ
//プライマリメニューバーは(3, 2, 1)というように右から並ぶため、Order by Desc で逆に並び替える
_primaryItems = page.ToolbarItems.Where(i => i.Order == ToolbarItemOrder.Primary).OrderByDescending(r => r.Priority).ToList();
_primaryItems.ForEach(t => page.ToolbarItems.Remove(t));
}
base.OnElementChanged(e);
}
public override void ViewWillAppear(bool animated)
{
//プライマリ
if (_primaryItems != null && _primaryItems.Count > 0)
{
var tools = new List<UIBarButtonItem>();
//スペース調整を追加(その1)
UIBarButtonItem sideMarginSpaceAdjustment1 = new UIBarButtonItem();
sideMarginSpaceAdjustment1.Width = -16.0f;
tools.Add(sideMarginSpaceAdjustment1);
_buttonPrimaryCommands.Clear();
foreach (var tool in _primaryItems)
{
tool.PropertyChanged += this.ToolPropertyChanged;
//UIButtonの設定
UIButton button = new UIButton();
button.SetImage(UIImage.FromFile(tool.Icon), UIControlState.Normal);
button.SizeToFit();
button.TintColor = UIColor.White;
button.TouchDown += this.ToolPrimaryClicked;
//UIBarButtonItemの設定
UIBarButtonItem buttonItem = new UIBarButtonItem(button);
buttonItem.Title = tool.Text;
buttonItem.Style = UIBarButtonItemStyle.Plain;
buttonItem.TintColor = UIColor.White;
_buttonPrimaryCommands.Add(button, tool.Command);
tools.Add(buttonItem);
//スペース調整を追加(その2)
UIBarButtonItem sideMarginSpaceAdjustment2 = new UIBarButtonItem();
sideMarginSpaceAdjustment2.Width = -16.0f;
tools.Add(sideMarginSpaceAdjustment2);
}
var navigationItem = this.NavigationController.TopViewController.NavigationItem;
if (navigationItem != null)
{
//ツールバーを再作成
navigationItem.RightBarButtonItems = tools.ToArray(); //逆順でセットされている
}
}
base.ViewWillAppear(animated);
}
/// <summary>
/// ツールバーアイテムが変更になった場合に外観を変更する
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
void ToolPropertyChanged(object sender, EventArgs args)
{
var navigationItem = this.NavigationController.TopViewController.NavigationItem;
if (navigationItem != null)
{
var tool = sender as ToolbarItem;
int cnt = navigationItem.RightBarButtonItems.Count() - 1; //逆順でセットされている為、メニューアイテム数から減算する為
int index = cnt - (tool.Priority + tool.Priority / 2); //sideMarginSpaceAdjustmentを入れた分だけindexを加算する
var button = (UIButton)(navigationItem.RightBarButtonItems[index].CustomView);
if (button != null)
{
//メニューアイコンを変更
if (tool.Icon != null)
{
button.SetImage(UIImage.FromFile(tool.Icon), UIControlState.Normal);
button.SizeToFit();
}
}
//メニュータイトル文字列を変更
navigationItem.RightBarButtonItems[index].Title = tool.Text;
}
}
/// <summary>
/// プライマリメニューのコマンドを実行する
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
void ToolPrimaryClicked(object sender, EventArgs args)
{
var tool = sender as UIButton;
var command = _buttonPrimaryCommands[tool];
command.Execute(null);
}
/// <summary>
/// 終了処理
/// </summary>
/// <param name="animated"></param>
public override void ViewWillDisappear(bool animated)
{
if (_primaryItems != null && _primaryItems.Count > 0)
{
NavigationController.SetToolbarHidden(true, animated);
this.NavigationItem.RightBarButtonItems = null;
_buttonPrimaryCommands.Clear();
}
base.ViewWillDisappear(animated);
}
}
}
※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。
入力されていないコメントには返信しませんのであらかじめご了承くださいませ。