Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin表单iOS自定义呈现程序用于选项卡式页面_Xamarin_Xamarin.forms_Xamarin.ios_Tabbedpage - Fatal编程技术网

Xamarin表单iOS自定义呈现程序用于选项卡式页面

Xamarin表单iOS自定义呈现程序用于选项卡式页面,xamarin,xamarin.forms,xamarin.ios,tabbedpage,Xamarin,Xamarin.forms,Xamarin.ios,Tabbedpage,我有Xamarin表单的标签页(iOS端)。我需要为选项卡式页面自定义渲染器-使第一个选项卡不可滚动(它可以显示为按钮或标签),其余的选项卡应可滚动。 我认为Xamarin表单选项卡式页面的创建者实现了类似于水平列表视图的选项卡。我只想把一个按钮作为左边的第一个元素,然后把这个列表视图和选项卡放在一起。单击按钮时,将打开新视图。怎么做 我正在使用Naxam库提供顶部选项卡式页面-这是对选项卡式页面的扩展(在iOS中,它位于底部)。我曾尝试使用自定义渲染器,但未命中断点。我不知道为什么 usin

我有Xamarin表单的标签页(iOS端)。我需要为选项卡式页面自定义渲染器-使第一个选项卡不可滚动(它可以显示为按钮或标签),其余的选项卡应可滚动。 我认为Xamarin表单选项卡式页面的创建者实现了类似于水平列表视图的选项卡。我只想把一个按钮作为左边的第一个元素,然后把这个列表视图和选项卡放在一起。单击按钮时,将打开新视图。怎么做

我正在使用Naxam库提供顶部选项卡式页面-这是对选项卡式页面的扩展(在iOS中,它位于底部)。我曾尝试使用自定义渲染器,但未命中断点。我不知道为什么

using CoreAnimation;
using CoreGraphics;
using Foundation;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(CustomTabbedPage), typeof(CustomTabbedPageRenderer))]
namespace Layout.xxx.iOS.CustomControlRenderers
{
    public class CustomTabbedPageRenderer : Naxam.Controls.Platform.iOS.TopTabbedRenderer
    {
        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);
            DependencyService.Get<IAlertHandler>().ShowCustomAlertVoid("", "OnElementChanged");
        }

        public override void ViewDidLoad()
        {
            base.ViewDidLoad();
            AddButtonToTabbedPage();
            DependencyService.Get<IAlertHandler>().ShowCustomAlertVoid("", "ViewDidLoad");
        }

        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);
            DependencyService.Get<IAlertHandler>().ShowCustomAlertVoid("", "Dispose");
        }

        public override void ViewDidAppear(bool animated)
        {
            base.ViewDidAppear(animated);
            DependencyService.Get<IAlertHandler>().ShowCustomAlertVoid("", "ViewDidAppear");
        }

        public override void ViewDidDisappear(bool animated)
        {
            base.ViewDidDisappear(animated);
            DependencyService.Get<IAlertHandler>().ShowCustomAlertVoid("", "ViewDidDisappear");
        }

        public override void ViewDidLayoutSubviews()
        {
            base.ViewDidLayoutSubviews();
            DependencyService.Get<IAlertHandler>().ShowCustomAlertVoid("", "ViewDidLayoutSubviews");
        }

        public override void DidMoveToParentViewController(UIViewController parent)
        {
            base.DidMoveToParentViewController(parent);
            DependencyService.Get<IAlertHandler>().ShowCustomAlertVoid("", "DidMoveToParentViewController");
        }

        private void AddButtonToTabbedPage()
        {
            var btn = new UIButton();
            CAGradientLayer btnGradient = new CAGradientLayer();
            btnGradient.Frame = btn.Bounds;
            btnGradient.Colors = new CGColor[] { Color.Black.ToCGColor(), Color.White.ToCGColor() };
            btnGradient.Locations = new NSNumber[] { 0.0f, 0.1f };
            btn.Layer.AddSublayer(btnGradient);
            btn.Layer.MasksToBounds = true;
            btn.Layer.BorderColor = Color.Blue.ToCGColor();
            btn.Layer.BorderWidth = 2;
            btn.Layer.SetNeedsDisplay();
        }
    }
}
使用CoreAnimation;
使用核心图形;
使用基础;
使用UIKit;
使用Xamarin.Forms;
使用Xamarin.Forms.Platform.iOS;
[程序集:ExportRenderer(typeof(CustomTabbedPage)、typeof(CustomTabbedPageRenderer))]
命名空间布局.xxx.iOS.CustomControlRenders
{
公共类CustomTabbedPageRenderer:Naxam.Controls.Platform.iOS.TopTabbedRenderer
{
受保护的覆盖无效OnElementChanged(VisualElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
DependencyService.Get().ShowCustomAlertVoid(“,“OnElementChanged”);
}
公共覆盖无效ViewDidLoad()
{
base.ViewDidLoad();
addButtonTablePage();
DependencyService.Get().ShowCustomAlertVoid(“,“ViewDidLoad”);
}
受保护的覆盖无效处置(布尔处置)
{
基地。处置(处置);
DependencyService.Get().ShowCustomAlertVoid(“,”Dispose”);
}
公共覆盖无效视图显示(布尔动画)
{
基本视图显示(动画);
DependencyService.Get().ShowCustomAlertVoid(“,”ViewDidDisplay”);
}
公共覆盖无效视图消失(布尔动画)
{
base.viewdiddemove(动画);
DependencyService.Get().ShowCustomAlertVoid(“,”viewdiddefine”);
}
公共覆盖无效ViewDidLayoutSubviews()
{
base.ViewDidLayoutSubviews();
DependencyService.Get().ShowCustomAlertVoid(“,“ViewDidLayoutSubviews”);
}
公共覆盖无效DidMoveToParentViewController(UIViewController父级)
{
base.DidMoveToParentViewController(父级);
DependencyService.Get().ShowCustomAlertVoid(“,“DidMoveToParentViewController”);
}
私有void addButtonTabledPage()
{
var btn=新UIButton();
CAGradientLayer btnGradient=新的CAGradientLayer();
btnGradient.Frame=btn.Bounds;
btnGradient.Colors=newcgcolor[]{Color.Black.ToCGColor(),Color.White.ToCGColor()};
btnGradient.Locations=新的NSNumber[]{0.0f,0.1f};
btn.Layer.AddSublayer(btnGradient);
btn.Layer.MasksToBounds=true;
btn.Layer.BorderColor=Color.Blue.togcolor();
btn.Layer.BorderWidth=2;
btn.Layer.SetNeedsDisplay();
}
}
}

如果要修复第一个选项卡,可以使用
自定义渲染器来实现它。更改
索引您需要添加noshifteffect来删除默认的滚动,它是特定于平台的。您可以添加代码以使第0个元素不可滚动我相信您可以共享一些您迄今为止尝试过的代码吗?问题中的屏幕截图在Android设备上。在iOS中,tabbar总是在底部,默认情况下页面不能滚动到下一页。我已经添加了代码,我已经尝试过了。屏幕截图来自Android,但当使用Naxam库时,标签在iOS中位于顶部。现在,选项卡式页面的工作原理与Android相同。我从Naxam顶级选项卡式页面github下载了全新的项目,然后输入了您的解决方案,但它没有按预期工作-第一个选项卡未修复。调试ViewDidLoad()时调用一次,但从未调用GetPreviousViewController。也许我遗漏了什么?@YoungEddie起初我遗漏了GetNextViewController中的代码。请看我编辑的答案。我还上传了一个示例项目:。注意:我只在iOS项目中编写自定义渲染器。我已经在iOS模拟器和真实设备上检查了github的更新解决方案。我不知道为什么,但第一个标签还没有固定。@YoungEddie你说的固定是什么意思?在我的示例中,第一个选项卡不允许滑动到第二个选项卡。我的意思是第一个选项卡在屏幕上始终可见。例如,如果我们有10个选项卡(同一时刻屏幕上只显示5个)。用户滚动至标签号10。然后在显示屏上,他看到标签号:1、7、8、9、10。当滚动到标签号5时,他会看到标签:1,3,4,5,6。
[assembly: ExportRenderer(typeof(myTopTabbedPage), typeof(myTopTabbedRenderer))]
namespace App12.iOS
{
    class myTopTabbedRenderer : TopTabbedRenderer, IUIPageViewControllerDataSource
    {

        public override void ViewDidLoad()
        {
            base.ViewDidLoad();
        }

        public new UIViewController GetPreviousViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
        {
            var index = ViewControllers.IndexOf(referenceViewController) - 1;

            //in the source, it is if (index < 0) return null;
            //change here to if (index < 1) will fix the first tab


            if (index < 1) return null;

            return ViewControllers[index];
        }

        public new UIViewController GetNextViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
        {
            var index = ViewControllers.IndexOf(referenceViewController) + 1;

            //in the source, it is if (index == ViewControllers.Count) return null;
            //change here to if (index == ViewControllers.Count || index == 1) will fix the first tab
            if (index == ViewControllers.Count || index == 1) return null;

            return ViewControllers[index];
        }
    }
}
public class myTopTabbedPage : TopTabbedPage { 


}

var tabs = new myTopTabbedPage
{
    Title = "TopTabs",
    BarBackgroundColor = Color.FromHex("#9C27B0"),
    SwipeEnabled = true,
    BarIndicatorColor = Color.Green,
    BarTextColor = Color.White
};