所有人(android、iOs和WinPhone)都可以使用Xamarin表单中带有Tabbar的ActionBar
我需要在xamarin表单中创建一个带有TabbedLayout控件的ActionBar,在xamarin Android中我很容易做到,但现在他们希望在平台IOS和Android中使用xamarin表单。请分享任何示例或给我建议如何在XamariFroms中创建自定义控件 下面我附上了图片我需要如何与选项卡式布局的行动栏所有人(android、iOs和WinPhone)都可以使用Xamarin表单中带有Tabbar的ActionBar,xamarin,xamarin.forms,Xamarin,Xamarin.forms,我需要在xamarin表单中创建一个带有TabbedLayout控件的ActionBar,在xamarin Android中我很容易做到,但现在他们希望在平台IOS和Android中使用xamarin表单。请分享任何示例或给我建议如何在XamariFroms中创建自定义控件 下面我附上了图片我需要如何与选项卡式布局的行动栏 要在Xamarin.Forms中获得选项卡式布局,您通常会使用。这将为您提供在Android上显示的选项卡。在iOS和Windows上,您将获得本机替代方案。这意味着您将在i
要在Xamarin.Forms中获得选项卡式布局,您通常会使用。这将为您提供在Android上显示的选项卡。在iOS和Windows上,您将获得本机替代方案。这意味着您将在iOS上的屏幕底部获得标签,在Windows上,您将在顶部获得标签(类似,但与Android完全相同)。参见Xamarin文档中的图示:
如果您想创建自己的版本,您可以实现自己版本的。以在Xamarin.Forms中获得选项卡式布局,您通常会使用。这将为您提供在Android上显示的选项卡。在iOS和Windows上,您将获得本机替代方案。这意味着您将在iOS上的屏幕底部获得标签,在Windows上,您将在顶部获得标签(类似,但与Android完全相同)。参见Xamarin文档中的图示:
如果您想创建自己的版本,您可以实现自己版本的。如果您使用的是Xamarin.Forms,则Android选项卡页面的选项卡项将位于顶部。对于iOS,必须创建渲染器才能实现它。但是,在顶部显示Tabbar项违反了iOS的用户指南 创建自定义渲染,覆盖ViewDidLayoutSubView并添加以下代码行
[assembly: ExportRenderer(typeof(ExtendedTabbedPage), typeof(ExtendedTabbedPageRenderer))]
namespace ExtendedTabbedPage.Pages
{
public class ExtendedTabbedPageRenderer : TabbedRenderer
{
private ExtendedTabbedPage Page => (ExtendedTabbedPage)Element;
public ExtendedTabbedPageRenderer()
{
}
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
base.OnElementChanged(e);
var page = (ExtendedTabbedPage)Element;
page.CurrentPageChanged += Page_CurrentPageChanged;
}
public override void ViewWillAppear(bool animated)
{
base.ViewWillAppear(animated);
Page_CurrentPageChanged();
}
public override void ViewDidLayoutSubviews()
{
base.ViewDidLayoutSubviews();
SetTabPostition();
}
void SetTabPostition()
{
if (Element == null)
return;
var element = Element as ExtendedTabbedPage;
this.TabBar.InvalidateIntrinsicContentSize();
nfloat tabSize = 74.0f;
UIInterfaceOrientation orientation = UIApplication.SharedApplication.StatusBarOrientation;
if (UIInterfaceOrientation.LandscapeLeft == orientation || UIInterfaceOrientation.LandscapeRight == orientation)
{
tabSize = 32.0f;
}
CGRect tabFrame = this.TabBar.Frame;
CGRect viewFrame = this.View.Frame;
tabFrame.Height = tabSize;
tabFrame.Y = this.View.Frame.Y;
this.TabBar.Frame = tabFrame;
this.TabBar.ContentMode = UIViewContentMode.Top;
PageController.ContainerArea = new Rectangle(0, tabFrame.Y + tabFrame.Height, viewFrame.Width, viewFrame.Height - tabFrame.Height);
this.TabBar.SetNeedsUpdateConstraints();
}
void Page_CurrentPageChanged()
{
var current = Tabbed.CurrentPage;
//if Tab is more than 5 then more will appear in iOS
if (current == null)
{
CGRect tabFrm = this.TabBar.Frame;
if (this.MoreNavigationController != null)
{
var morenavframe = this.MoreNavigationController.View.Frame;
morenavframe.Y = tabFrm.Y + tabFrm.Height;
this.MoreNavigationController.View.Frame = morenavframe;
foreach (var morecontroller in this.MoreNavigationController.ViewControllers)
{
var morecontframe = morecontroller.View.Frame;
morecontframe.Y = morenavframe.Y + morenavframe.Height;
morecontroller.View.Frame = tabFrm;
}
}
return;
}
var controller = Platform.GetRenderer(current);
if (controller == null)
return;
var frame = controller.ViewController.View.Frame;
CGRect tabFrame = this.TabBar.Frame;
frame.Y = (tabFrame.Y + tabFrame.Height);
controller.ViewController.View.Frame = frame;
this.View.Frame = frame;
}
public override void ViewDidAppear(bool animated)
{
base.ViewDidAppear(animated);
Page_CurrentPageChanged();
}
}
}
如果您使用的是Xamarin.Forms选项卡式页面,对于Android,选项卡项将位于顶部。对于iOS,必须创建渲染器才能实现它。但是,在顶部显示Tabbar项违反了iOS的用户指南 创建自定义渲染,覆盖ViewDidLayoutSubView并添加以下代码行
[assembly: ExportRenderer(typeof(ExtendedTabbedPage), typeof(ExtendedTabbedPageRenderer))]
namespace ExtendedTabbedPage.Pages
{
public class ExtendedTabbedPageRenderer : TabbedRenderer
{
private ExtendedTabbedPage Page => (ExtendedTabbedPage)Element;
public ExtendedTabbedPageRenderer()
{
}
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
base.OnElementChanged(e);
var page = (ExtendedTabbedPage)Element;
page.CurrentPageChanged += Page_CurrentPageChanged;
}
public override void ViewWillAppear(bool animated)
{
base.ViewWillAppear(animated);
Page_CurrentPageChanged();
}
public override void ViewDidLayoutSubviews()
{
base.ViewDidLayoutSubviews();
SetTabPostition();
}
void SetTabPostition()
{
if (Element == null)
return;
var element = Element as ExtendedTabbedPage;
this.TabBar.InvalidateIntrinsicContentSize();
nfloat tabSize = 74.0f;
UIInterfaceOrientation orientation = UIApplication.SharedApplication.StatusBarOrientation;
if (UIInterfaceOrientation.LandscapeLeft == orientation || UIInterfaceOrientation.LandscapeRight == orientation)
{
tabSize = 32.0f;
}
CGRect tabFrame = this.TabBar.Frame;
CGRect viewFrame = this.View.Frame;
tabFrame.Height = tabSize;
tabFrame.Y = this.View.Frame.Y;
this.TabBar.Frame = tabFrame;
this.TabBar.ContentMode = UIViewContentMode.Top;
PageController.ContainerArea = new Rectangle(0, tabFrame.Y + tabFrame.Height, viewFrame.Width, viewFrame.Height - tabFrame.Height);
this.TabBar.SetNeedsUpdateConstraints();
}
void Page_CurrentPageChanged()
{
var current = Tabbed.CurrentPage;
//if Tab is more than 5 then more will appear in iOS
if (current == null)
{
CGRect tabFrm = this.TabBar.Frame;
if (this.MoreNavigationController != null)
{
var morenavframe = this.MoreNavigationController.View.Frame;
morenavframe.Y = tabFrm.Y + tabFrm.Height;
this.MoreNavigationController.View.Frame = morenavframe;
foreach (var morecontroller in this.MoreNavigationController.ViewControllers)
{
var morecontframe = morecontroller.View.Frame;
morecontframe.Y = morenavframe.Y + morenavframe.Height;
morecontroller.View.Frame = tabFrm;
}
}
return;
}
var controller = Platform.GetRenderer(current);
if (controller == null)
return;
var frame = controller.ViewController.View.Frame;
CGRect tabFrame = this.TabBar.Frame;
frame.Y = (tabFrame.Y + tabFrame.Height);
controller.ViewController.View.Frame = frame;
this.View.Frame = frame;
}
public override void ViewDidAppear(bool animated)
{
base.ViewDidAppear(animated);
Page_CurrentPageChanged();
}
}
}
我需要为所有的平台@Jon Stodle设计相同的样式,然后您必须对
多页进行子类化,并自己实现它。我没有亲自做过,但我知道以前也做过。谢谢@Jon Stodle如果你发现任何例子,请与mei分享@Jon Stodle需要为所有平台设计相同的样式,那么你必须对多页
进行子类化,然后自己实现它。我没有亲自做过,但我知道以前也做过。谢谢@Jon Stodle如果你发现任何例子,请与我分享