public Task Transition(IShellItemRenderer oldRenderer, IShellItemRenderer newRenderer)
        {
            TaskCompletionSource <bool> task = new TaskCompletionSource <bool>();
            var oldView = oldRenderer.ViewController.View;
            var newView = newRenderer.ViewController.View;

            oldView.Layer.RemoveAllAnimations();
            newView.Alpha = 0;

            oldView.Superview.InsertSubviewAbove(newView, oldView);

            UIView.Animate(0.5, 0, UIViewAnimationOptions.BeginFromCurrentState, () => newView.Alpha = 1, () =>
            {
                task.TrySetResult(true);
            });

            return(task.Task);
        }
Exemple #2
0
        protected virtual void SwitchFragment(FragmentManager manager, AView targetView, ShellItem newItem, bool animate = true)
        {
            Profile.FrameBegin();

            Profile.FramePartition("IsDesignerContext");
            if (AndroidContext.IsDesignerContext())
            {
                return;
            }

            Profile.FramePartition("CreateShellItemRenderer");
            var previousRenderer = _currentRenderer;

            _currentRenderer           = CreateShellItemRenderer(newItem);
            _currentRenderer.ShellItem = newItem;
            var fragment = _currentRenderer.Fragment;

            Profile.FramePartition("Transaction");
            FragmentTransaction transaction = manager.BeginTransaction();

            if (animate)
            {
                transaction.SetTransitionEx((int)global::Android.App.FragmentTransit.EnterMask);
            }

            transaction.ReplaceEx(_frameLayout.Id, fragment);
            transaction.CommitAllowingStateLossEx();

            Profile.FramePartition("OnDestroyed");
            void OnDestroyed(object sender, EventArgs args)
            {
                previousRenderer.Destroyed -= OnDestroyed;

                previousRenderer.Dispose();
                previousRenderer = null;
            }

            if (previousRenderer != null)
            {
                previousRenderer.Destroyed += OnDestroyed;
            }

            Profile.FrameEnd();
        }
Exemple #3
0
        protected virtual void SwitchFragment(FragmentManager manager, AView targetView, ShellItem newItem, bool animate = true)
        {
            var previousView = _currentView;

            _currentView           = CreateShellItemRenderer(newItem);
            _currentView.ShellItem = newItem;
            var fragment = _currentView.Fragment;

            FragmentTransaction transaction = manager.BeginTransactionEx();

            if (animate)
            {
                transaction.SetTransitionEx((int)global::Android.App.FragmentTransit.FragmentOpen);
            }

            transaction.ReplaceEx(_frameLayout.Id, fragment);

            // Don't force the commit if this is our first load
            if (previousView == null)
            {
                transaction
                .SetReorderingAllowedEx(true);
            }

            transaction.CommitAllowingStateLossEx();

            void OnDestroyed(object sender, EventArgs args)
            {
                previousView.Destroyed -= OnDestroyed;

                previousView.Dispose();
                previousView = null;
            }

            if (previousView != null)
            {
                previousView.Destroyed += OnDestroyed;
            }
        }
        protected async void SetCurrentShellItemController(IShellItemRenderer value)
        {
            var oldRenderer = _currentShellItemRenderer;
            var newRenderer = value;

            _currentShellItemRenderer = value;

            AddChildViewController(newRenderer.ViewController);
            View.AddSubview(newRenderer.ViewController.View);
            View.SendSubviewToBack(newRenderer.ViewController.View);

            newRenderer.ViewController.View.Frame = View.Bounds;

            if (oldRenderer != null)
            {
                var transition = CreateShellItemTransition();
                await transition.Transition(oldRenderer, newRenderer);

                oldRenderer.ViewController.RemoveFromParentViewController();
                oldRenderer.ViewController.View.RemoveFromSuperview();
                oldRenderer.Dispose();
            }
        }
Exemple #5
0
        protected virtual void Dispose(bool disposing)
        {
            if (_disposed)
            {
                return;
            }

            _disposed = true;

            if (disposing)
            {
                if (_currentRenderer != null && _currentRenderer.Fragment.IsAlive())
                {
                    FragmentTransaction transaction = FragmentManager.BeginTransaction();
                    transaction.RemoveEx(_currentRenderer.Fragment);
                    transaction.CommitAllowingStateLossEx();
                    FragmentManager.ExecutePendingTransactionsEx();
                }

                Element.PropertyChanged -= OnElementPropertyChanged;
                Element.SizeChanged     -= OnElementSizeChanged;
                ((IShellController)Element).RemoveAppearanceObserver(this);

                // This cast is necessary because IShellFlyoutRenderer doesn't implement IDisposable
                (_flyoutRenderer as IDisposable)?.Dispose();

                _currentRenderer.Dispose();
                _currentRenderer = null;
            }

            Element = null;
            // TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
            // TODO: set large fields to null.

            _disposed = true;
        }