Xamarin Forms iOS пользовательский рендер - PullRequest
0 голосов
/ 18 октября 2019

У меня есть страница с вкладками в формах Xamarin (для iOS). Мне нужен пользовательский рендерер для страницы с вкладками - сделайте первую вкладку не прокручиваемой (это может быть показано как кнопка или метка), остальные вкладки должны быть прокручиваемыми. Я думаю, что создатели страницы с вкладками Xamarin Forms реализовали вкладки как горизонтальный просмотр списка. Я просто хочу поместить кнопку в качестве первого элемента слева, а затем поместить этот список с вкладками. При нажатии кнопки открывается новый вид. Как это сделать?

enter image description here

Я использую библиотеку 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();
        }
    }
}

1 Ответ

0 голосов
/ 22 октября 2019

Если вы хотите исправить первую вкладку, вы можете использовать custom renderer для ее достижения. Измените index<0 на index<1, чтобы исправить первую вкладку в методе GetPreviousViewController и GetNextViewController:

[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];
        }
    }
}

А в проекте xamarin.forms используйте myTopTabbedPage для создания вкладок:

public class myTopTabbedPage : TopTabbedPage { 


}

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

Попробуйте и дайте мне знать, если это работает для вас.

...