Inheritance: UIViewController
        UIViewController CreateViewController(int index)
        {
            Xamarin.Forms.View formsView      = null;
            object             bindingContext = null;

            if (Element.ItemsSource != null)
            {
                bindingContext = Element.ItemsSource.Cast <object> ().ElementAt(index);
            }

            var selector = Element.ItemTemplate as DataTemplateSelector;

            if (selector != null)
            {
                formsView = (Xamarin.Forms.View)selector.SelectTemplate(bindingContext, Element).CreateContent();
            }
            else
            {
                formsView = (Xamarin.Forms.View)Element.ItemTemplate.CreateContent();
            }

            formsView.BindingContext = bindingContext;

            // UIScreen.MainScreen.Bounds.Width, UIScreen.MainScreen.Bounds.Height
            var rect            = new CGRect(Element.X, Element.Y, ElementWidth, ElementHeight);
            var nativeConverted = FormsViewToNativeiOS.ConvertFormsToNative(formsView, rect);

            var viewController = new ViewContainer();

            viewController.Tag  = index;
            viewController.View = nativeConverted;

            return(viewController);
        }
        UIViewController CreateViewController(int index)
        {
            View formsView = null;

            object bindingContext = null;

            if (Source != null && Source?.Count > 0)
            {
                bindingContext = Source.Cast <object>().ElementAt(index);
            }

            var dt = bindingContext as DataTemplate;

            // Support for List<DataTemplate> as ItemsSource
            if (dt != null)
            {
                formsView = (View)dt.CreateContent();
            }
            else
            {
                var selector = Element.ItemTemplate as DataTemplateSelector;
                if (selector != null)
                {
                    formsView = (View)selector.SelectTemplate(bindingContext, Element).CreateContent();
                }
                else
                {
                    formsView = (View)Element.ItemTemplate.CreateContent();
                }

                formsView.BindingContext = bindingContext;
            }

            // HeightRequest fix
            formsView.Parent = this.Element;

            // UIScreen.MainScreen.Bounds.Width, UIScreen.MainScreen.Bounds.Height
            var rect            = new CGRect(Element.X, Element.Y, ElementWidth, ElementHeight);
            var nativeConverted = formsView.ToiOS(rect);

            var viewController = new ViewContainer();

            viewController.Tag  = bindingContext;
            viewController.View = nativeConverted;

            return(viewController);
        }
Example #3
0
        UIViewController CreateViewController(int index)
        {
            // Significant Memory Leak for iOS when using custom layout for page content #125
            var newTag = Source[index];

            foreach (ViewContainer child in pageController.ChildViewControllers)
            {
                if (child.Tag == newTag)
                {
                    return(child);
                }
            }

            View formsView = null;

            object bindingContext = null;

            if (Source != null && Source?.Count > 0)
            {
                bindingContext = Source.Cast <object>().ElementAt(index);
            }

            var dt = bindingContext as DataTemplate;
            // Support for List<View> as ItemsSource
            var view = bindingContext as View;

            // Support for List<DataTemplate> as ItemsSource
            if (dt != null)
            {
                formsView = (View)dt.CreateContent();
            }
            else
            {
                if (view != null)
                {
                    if (ChildViewControllers == null)
                    {
                        ChildViewControllers = new List <ViewContainer>();
                    }

                    // Return from the local copy of controllers
                    foreach (ViewContainer controller in ChildViewControllers)
                    {
                        if (controller.Tag == view)
                        {
                            return(controller);
                        }
                    }

                    formsView = view;
                }
                else
                {
                    var selector = Element.ItemTemplate as DataTemplateSelector;
                    if (selector != null)
                    {
                        formsView = (View)selector.SelectTemplate(bindingContext, Element).CreateContent();
                    }
                    else
                    {
                        formsView = (View)Element.ItemTemplate.CreateContent();
                    }

                    formsView.BindingContext = bindingContext;
                }
            }

            // HeightRequest fix
            formsView.Parent = this.Element;

            // UIScreen.MainScreen.Bounds.Width, UIScreen.MainScreen.Bounds.Height
            var rect            = new CGRect(Element.X, Element.Y, ElementWidth, ElementHeight);
            var nativeConverted = formsView.ToiOS(rect);

            //if (dt == null && view == null)
            //formsView.Parent = null;

            var viewController = new ViewContainer();

            viewController.Tag  = bindingContext;
            viewController.View = nativeConverted;

            // Only happens when ItemsSource is List<View>
            if (ChildViewControllers != null)
            {
                ChildViewControllers.Add(viewController);
                Console.WriteLine("ChildViewControllers count = " + ChildViewControllers.Count());
            }

            return(viewController);
        }