コメント
コメントの投稿
※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。
入力されていないコメントには返信しませんのであらかじめご了承くださいませ。
using System;
using System.Collections.Generic;
using System.Text;
using UIKit;
using System.Linq;
using CoreGraphics;
using Xamarin.Forms.Platform.iOS;
using Xamarin.Forms;
[assembly: ExportRenderer(typeof(NavigationPage), typeof(AppName.iOS.Renderer.PatchedNavigationRenderer))]
namespace AppName.iOS.Renderer
{
public class PatchedNavigationRenderer : NavigationRenderer
{
public override void ViewWillAppear(bool animated)
{
var badBar = View.Subviews.OfType<UIToolbar>().FirstOrDefault(v => v.GetType() != typeof(UIToolbar));
if (badBar != null)
{
badBar.RemoveFromSuperview();
}
base.ViewWillAppear(animated);
}
public override void ViewDidLayoutSubviews()
{
base.ViewDidLayoutSubviews();
UIView[] subviews = View.Subviews.Where(v => v != NavigationBar).ToArray();
var toolBarViews = subviews.Where(v => v is UIToolbar).ToArray();
//Toolbar以外のViewの高さ調整は、Viewの下部がタッチできなくなるため必要ないと判断していますのでコメントアウト
//var otherViews = subviews.Where(v => !(v is UIToolbar)).ToArray();
nfloat toolbarHeight = 0;
foreach (var uIView in toolBarViews)
{
uIView.SizeToFit();
uIView.Frame = new CGRect
{
X = 0,
Y = View.Bounds.Height - uIView.Frame.Height,
Width = View.Bounds.Width,
Height = uIView.Frame.Height,
};
var thisToolbarHeight = uIView.Frame.Height;
if (toolbarHeight < thisToolbarHeight)
{
toolbarHeight = thisToolbarHeight;
}
}
//Toolbar以外のViewの高さ調整は、Viewの下部がタッチできなくなるため必要ないと判断していますのでコメントアウト
//var othersHeight = View.Bounds.Height - toolbarHeight;
//var othersFrame = new CGRect(View.Bounds.X, View.Bounds.Y, View.Bounds.Width, othersHeight);
//foreach (var uIView in otherViews)
//{
// uIView.Frame = othersFrame;
//}
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Windows.Input;
using Xamarin.Forms.Platform.iOS;
using Xamarin.Forms;
using UIKit;
using CoreGraphics;
[assembly: ExportRenderer(typeof(Page), typeof(AppName.iOS.Renderer.ToolbarRenderer))]
namespace AppName.iOS.Renderer
{
public class ToolbarRenderer : PageRenderer
{
UIToolbar _toolbar;
List<ToolbarItem> _secondaryItems;
readonly Dictionary<UIBarButtonItem, ICommand> _buttonCommands = new Dictionary<UIBarButtonItem, ICommand>();
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
var page = e.NewElement as Page;
if (page != null)
{
_secondaryItems = page.ToolbarItems.Where(i => i.Order == ToolbarItemOrder.Secondary).ToList();
_secondaryItems.ForEach(t => page.ToolbarItems.Remove(t));
}
base.OnElementChanged(e);
}
public override void ViewWillAppear(bool animated)
{
if (_secondaryItems != null && _secondaryItems.Count > 0)
{
var tools = new List<UIBarButtonItem>();
_buttonCommands.Clear();
foreach (var tool in _secondaryItems)
{
UIBarButtonItem button;
UIBarButtonSystemItem systemItem;
button = Enum.TryParse<UIBarButtonSystemItem>(tool.Text, out systemItem)
? new UIBarButtonItem(systemItem, ToolClicked)
: new UIBarButtonItem(tool.Text, UIBarButtonItemStyle.Plain, ToolClicked);
button.Image = UIImage.FromFile(tool.Icon); //Iconを設定
_buttonCommands.Add(button, tool.Command);
tools.Add(button);
}
NavigationController.SetToolbarHidden(false, animated);
_toolbar = new UIToolbar(CGRect.Empty) { Items = tools.ToArray() };
NavigationController.View.Add(_toolbar);
}
base.ViewWillAppear(animated);
}
void ToolClicked(object sender, EventArgs args)
{
var tool = sender as UIBarButtonItem;
var command = _buttonCommands[tool];
command.Execute(null);
}
public override void ViewWillDisappear(bool animated)
{
if (_toolbar != null)
{
NavigationController.SetToolbarHidden(true, animated);
_toolbar.RemoveFromSuperview();
_toolbar = null;
_buttonCommands.Clear();
}
base.ViewWillDisappear(animated);
}
}
}
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
_vece = e;
var page = e.NewElement as Page;
if (page != null)
{
//セカンダリ
if (_secondaryItems != null && _secondaryItems.Count > 0)
{
if (_toolbar != null)
{
//必ず前に設定したツールバーを破棄する
_toolbar.RemoveFromSuperview();
_toolbar = null;
}
_secondaryItems.Clear();
_secondaryItems = null;
}
_secondaryItems = page.ToolbarItems.Where(i => i.Order == ToolbarItemOrder.Secondary).ToList();
_secondaryItems.ForEach(t => page.ToolbarItems.Remove(t));
}
base.OnElementChanged(e);
}
※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。
入力されていないコメントには返信しませんのであらかじめご了承くださいませ。