コード例 #1
0
        public override void ItemSelected(UITabBar tabbar, UITabBarItem item)
        {
            var targetViewController = ViewControllers.Single(vc => vc.TabBarItem == item);

            if (targetViewController is UINavigationController navigationController &&
                navigationController.TopViewController is ReportsViewController)
            {
                ViewModel.StartReportsStopwatch();
            }

            if (targetViewController == SelectedViewController &&
                tryGetScrollableController() is IScrollableToTop scrollable)
            {
                scrollable.ScrollToTop();
            }

            UIViewController tryGetScrollableController()
            {
                if (targetViewController is IScrollableToTop)
                {
                    return(targetViewController);
                }

                if (targetViewController is UINavigationController nav)
                {
                    return(nav.TopViewController);
                }

                return(null);
            }
        }
コード例 #2
0
        public virtual void ShowTabView(UIViewController viewController, string tabTitle, string tabIconName, string tabAccessibilityIdentifier = null)
        {
            if (!string.IsNullOrEmpty(tabAccessibilityIdentifier))
            {
                viewController.View.AccessibilityIdentifier = tabAccessibilityIdentifier;
            }

            // setup Tab
            SetTitleAndTabBarItem(viewController, tabTitle, tabIconName);

            // add Tab
            var currentTabs = new List <UIViewController>();

            if (ViewControllers != null)
            {
                currentTabs = ViewControllers.ToList();
            }

            if (viewController as UINavigationController != null)
            {
                (viewController as UINavigationController).NavigationBar.Translucent = false;
            }

            currentTabs.Add(viewController);

            // update current Tabs
            ViewControllers = currentTabs.ToArray();
        }
コード例 #3
0
        public void MoveToViewControllerAtIndex(uint index, bool animated = true)
        {
            if (!(IsViewLoaded && View.Window != null && CurrentIndex != index))
            {
                PreCurrentIndex = index;
                return;
            }

            if (animated && PagerBehaviour.SkipIntermediateViewControllers == true && Math.Abs(CurrentIndex - index) > 1)
            {
                // create a copy of the view controller array so the
                // orignal view controller array indices don't get modified
                var tmpViewControllers = ViewControllers.ToArray();
                var currentChildVC     = ViewControllers[CurrentIndex];
                var fromIndex          = CurrentIndex < index ? index - 1 : index + 1;
                var fromChildVC        = ViewControllers[fromIndex];
                tmpViewControllers[CurrentIndex] = fromChildVC;
                tmpViewControllers[fromIndex]    = currentChildVC;
                pagerTabStripChildViewControllersForScrolling = tmpViewControllers;
                ContainerView.SetContentOffset(new CGPoint(PageOffsetForChildIndex(index: fromIndex), 0), animated: false);
                (NavigationController?.View ?? View).UserInteractionEnabled = false;
                ContainerView.SetContentOffset(new CGPoint(PageOffsetForChildIndex(index: index), 0), animated: true);
            }
            else
            {
                (NavigationController?.View ?? View).UserInteractionEnabled = false;
                ContainerView.SetContentOffset(new CGPoint(PageOffsetForChildIndex(index: index), 0), animated: animated);
            }
        }
コード例 #4
0
            public override UIViewController PopViewController(bool animated)
            {
                var c = ViewControllers.LastOrDefault();

                Router.BackAsync();
                return(c);
            }
コード例 #5
0
        public virtual void ShowTabView(UIViewController viewController, bool wrapInNavigationController, string tabTitle, string tabIconName)
        {
            // setup Tab
            SetTitleAndTabBarItem(viewController, tabTitle, tabIconName);

            // add Tab
            var currentTabs = new List <UIViewController>();

            if (ViewControllers != null)
            {
                currentTabs = ViewControllers.ToList();
            }

            if (wrapInNavigationController)
            {
                var navController = new UINavigationController();

                navController.NavigationBar.Translucent = false;

                navController.PushViewController(viewController, true);
                currentTabs.Add(navController);
            }
            else
            {
                currentTabs.Add(viewController);
            }
            // update current Tabs
            ViewControllers = currentTabs.ToArray();
        }
コード例 #6
0
        public override void ItemSelected(UITabBar tabbar, UITabBarItem item)
        {
            var targetViewController = ViewControllers.Single(vc => vc.TabBarItem == item);

            if (targetViewController == SelectedViewController &&
                tryGetScrollableController() is IScrollableToTop scrollable)
            {
                scrollable.ScrollToTop();
            }
            else if (targetViewController is ReactiveNavigationController navigationController)
            {
                if (navigationController.TopViewController is IReactiveViewController reactiveViewController)
                {
                    reactiveViewController.DismissFromNavigationController();
                }
            }

            UIViewController tryGetScrollableController()
            {
                if (targetViewController is IScrollableToTop)
                {
                    return(targetViewController);
                }

                if (targetViewController is UINavigationController nav)
                {
                    return(nav.TopViewController);
                }

                return(null);
            }
        }
        public override sealed void ViewDidLoad()
        {
            if (!_viewConstructed)
            {
                return;
            }

            base.ViewDidLoad();

            // Create and set tabs.
            var viewControllers = new[]
            {
                CreateTabViewController <DetailsTabView>("Details", "DetailsTabBarIcon", 0),
                CreateTabViewController <ConversationsTabView>("Conversations", "ConversationsTabBarIcon", 1),
                CreateTabViewController <FilesTabView>("Files", "FilesTabBarIcon", 2),
                CreateTabViewController <TasksTabView>("Tasks", "TasksTabBarIcon", 3)
            };

            ViewControllers        = viewControllers;
            SelectedViewController = ViewControllers.First();

            // "Bind" the network activity indicator to the loading property.
            UIApplication.SharedApplication.NetworkActivityIndicatorVisible = true;
            ViewModel.WeakSubscribe((sender, e) =>
            {
                if (e.PropertyName != nameof(ViewModel.IsLoading))
                {
                    return;
                }
                UIApplication.SharedApplication.NetworkActivityIndicatorVisible = ViewModel.IsLoading;
            });
        }
コード例 #8
0
        protected override void Dispose(bool disposing)
        {
            var formsItems = (Element as NavigationPageEx).CurrentPage
                             .ToolbarItems
                             .Where(x => x.Order != ToolbarItemOrder.Secondary)
                             .OrderByDescending(x => x.Priority);

            foreach (var item in formsItems)
            {
                var itemEx = item as ToolbarItemEx;
                if (itemEx == null)
                {
                    continue;
                }
                itemEx.PropertyChanged -= ItemEx_PropertyChanged;
            }

            var ctrl = ViewControllers.Last();

            foreach (var item in ctrl.NavigationItem.LeftBarButtonItems)
            {
                item.Dispose();
            }

            base.Dispose(disposing);
        }
コード例 #9
0
        void RemovePage(Page page)
        {
            if (page == null)
            {
                throw new ArgumentNullException("page");
            }
            if (page == Current)
            {
                throw new NotSupportedException();                 // should never happen as NavPage protecs against this
            }
            var target = Platform.GetRenderer(page).ViewController.ParentViewController;

            // So the ViewControllers property is not very property like on iOS. Assigning to it doesn't cause it to be
            // immediately reflected into the property. The change will not be reflected until there has been sufficient time
            // to process it (it ends up on the event queue). So to resolve this issue we keep our own stack until we
            // know iOS has processed it, and make sure any updates use that.

            // In the future we may want to make RemovePageAsync and deprecate RemovePage to handle cases where Push/Pop is called
            // during a remove cycle.

            if (_removeControllers == null)
            {
                _removeControllers = ViewControllers.Remove(target);
                ViewControllers    = _removeControllers;
                Device.BeginInvokeOnMainThread(() => { _removeControllers = null; });
            }
            else
            {
                _removeControllers = _removeControllers.Remove(target);
                ViewControllers    = _removeControllers;
            }
        }
コード例 #10
0
        protected virtual void OnRemoveRequested(NavigationRequestedEventArgs e)
        {
            var page = e.Page;

            var renderer       = Platform.GetRenderer(page);
            var viewController = renderer?.ViewController;

            if (viewController == null && _trackers.ContainsKey(page))
            {
                viewController = _trackers[page].ViewController;
            }

            if (viewController != null)
            {
                if (viewController == TopViewController)
                {
                    e.Animated = false;
                    OnPopRequested(e);
                }

                if (ViewControllers.Contains(viewController))
                {
                    ViewControllers = ViewControllers.Remove(viewController);
                }

                DisposePage(page);
            }
        }
コード例 #11
0
        public virtual void ReloadPagerTabStripView()
        {
            if (IsViewLoaded)
            {
                foreach (UIViewController childController in ViewControllers)
                {
                    if (childController.ParentViewController != null)
                    {
                        childController.BeginAppearanceTransition(false, false);
                        childController.WillMoveToParentViewController(null);
                        childController.View.RemoveFromSuperview();
                        childController.RemoveFromParentViewController();
                        childController.EndAppearanceTransition();
                    }
                }

                ReloadViewControllers();
                ContainerView.ContentSize = new CGSize(ContainerView.Bounds.Width * new nfloat(ViewControllers.Count()), ContainerView.ContentSize.Height);
                if (CurrentIndex >= ViewControllers.Count())
                {
                    CurrentIndex = (uint)ViewControllers.Count() - 1;
                }
                ContainerView.ContentOffset = new CGPoint(PageOffsetForChildIndex(CurrentIndex), 0);
                UpdateContent();
            }
        }
コード例 #12
0
 /// <summary>
 /// 返回到最初的控制器
 /// </summary>
 public void PopToRootViewController()
 {
     for (int i = ViewControllers.Count - 1; i > 0; i--)
     {
         ViewControllers[i].DismissViewController();
         ViewControllers.RemoveAt(i);
     }
 }
コード例 #13
0
        /// <summary>
        /// 跳转到新的控制器
        /// </summary>
        /// <param name="viewController"></param>
        /// <param name="animated"></param>
        public virtual void PushViewController(UIViewController viewController, bool animated = false)
        {
            ViewControllers.Add(viewController);
            viewController.sortingOrder = LayerOrder + 1;


            UIRoot.Instance.NormalRoot.AddChild(viewController);
        }
コード例 #14
0
		//TODO: this was deprecated in iOS8.0 and is not called in 9.0+
		public override void DidRotate(UIInterfaceOrientation fromInterfaceOrientation)
		{
			base.DidRotate(fromInterfaceOrientation);

			View.SetNeedsLayout();

			var parentingViewController = (ParentingViewController)ViewControllers.Last();
			parentingViewController?.UpdateLeftBarButtonItem();
		}
コード例 #15
0
		public NavigationRenderer() : base(typeof(FormsNavigationBar), null)
		{
			MessagingCenter.Subscribe<IVisualElementRenderer>(this, UpdateToolbarButtons, sender =>
			{
				if (!ViewControllers.Any())
					return;
				var parentingViewController = (ParentingViewController)ViewControllers.Last();
				parentingViewController?.UpdateLeftBarButtonItem();
			});
		}
コード例 #16
0
        public override void ItemSelected(UITabBar tabbar, UITabBarItem item)
        {
            var targetViewController = ViewControllers.Single(vc => vc.TabBarItem == item);

            if (targetViewController is UINavigationController navigationController &&
                navigationController.TopViewController is ReportsViewController)
            {
                ViewModel.StartReportsStopwatch();
            }
        }
コード例 #17
0
 public override UIViewController PopViewController(bool animated)
 {
     if (ViewControllers.Length <= 2)
     {
         var vc = ViewControllers.LastOrDefault();
         DismissViewController(animated, () => base.PopViewController(false));
         return(vc);
     }
     return(base.PopViewController(animated));
 }
コード例 #18
0
        /// <summary>
        /// 销毁 Push 出来的控制器
        /// </summary>
        /// <param name="animated"></param>
        public virtual UIViewController PopViewController(bool animated = false)
        {
            GObject[]        gObjects           = UIRoot.Instance.NormalRoot.GetChildren();
            int              index              = gObjects.Length - 1;
            UIViewController pushViewController = (UIViewController)UIRoot.Instance.NormalRoot.GetChildAt(index);

            pushViewController.DismissViewController(animated);
            ViewControllers.Remove(pushViewController);
            return(pushViewController);
        }
        public UIViewController GetNextViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
        {
            var index = ViewControllers.IndexOf(referenceViewController) + 1;

            if (index == ViewControllers.Count)
            {
                return(null);
            }

            return(ViewControllers[index]);
        }
コード例 #20
0
ファイル: WeatherPvc.cs プロジェクト: skynode/XWeather
        void handleUpdatedSelected(object sender, EventArgs e)
        {
            refreshForUpdatedSelected();

            var current = ViewControllers.FirstOrDefault();

            if (current != null)
            {
                Analytics.TrackPageViewStart(current, childPageName(current), WuClient.Shared.Selected);
            }
        }
        public UIViewController GetPreviousViewController(UIPageViewController pageViewController, UIViewController referenceViewController)
        {
            var index = ViewControllers.IndexOf(referenceViewController) - 1;

            if (index < 0)
            {
                return(null);
            }

            return(ViewControllers[index]);
        }
コード例 #22
0
        public nfloat OffsetForChild(UIViewController viewController)
        {
            var index = ViewControllers.IndexOf(viewController);

            if (index > -1)
            {
                throw new ViewControllerNotContainedInPagerTabStrip();
            }

            return(OffsetForChild(index));
        }
コード例 #23
0
        public override UIViewController PopViewController(bool animated)
        {
            var viewControllerToPop = ViewControllers.Last();

            if (viewControllerToPop is IReactiveViewController reactiveViewController)
            {
                reactiveViewController.DismissFromNavigationController();
            }

            return(base.PopViewController(animated));
        }
コード例 #24
0
        public override UIViewController PopViewController(bool animated)
        {
            var viewControllerToPop = ViewControllers.Last();

            if (viewControllerToPop is IReactiveViewController reactiveViewController)
            {
                reactiveViewController.ViewcontrollerWasPopped();
            }

            return(base.PopViewController(animated));
        }
コード例 #25
0
		void InsertPageBefore(Page page, Page before)
		{
			if (before == null)
				throw new ArgumentNullException("before");
			if (page == null)
				throw new ArgumentNullException("page");

			var pageContainer = CreateViewControllerForPage(page);
			var target = Platform.GetRenderer(before).ViewController.ParentViewController;
			ViewControllers = ViewControllers.Insert(ViewControllers.IndexOf(target), pageContainer);
		}
コード例 #26
0
        public override UIViewController[] PopToRootViewController(bool animated)
        {
            UIViewController[] vcs = null;
            if (VisibleViewController != ViewControllers.FirstOrDefault())
            {
                regularPop = TopViewController != ViewControllers.FirstOrDefault();
                vcs        = base.PopToRootViewController(animated);
            }

            return(vcs);
        }
コード例 #27
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            if (!ViewControllers.Any())
            {
                return;
            }
            var parentingViewController = ViewControllers.Last();

            UpdateLeftBarButton(parentingViewController);
        }
コード例 #28
0
 public NavigationRenderer()
 {
     MessagingCenter.Subscribe <IVisualElementRenderer>(this, UpdateToolbarButtons, sender =>
     {
         if (!ViewControllers.Any())
         {
             return;
         }
         var parentingViewController = (ParentingViewController)ViewControllers.Last();
         UpdateLeftBarButtonItem(parentingViewController);
     });
 }
コード例 #29
0
        void DisposePage(IPage page, bool calledFromDispose = false)
        {
            if (_trackers.TryGetValue(page, out var tracker))
            {
                if (!calledFromDispose && tracker.ViewController != null && ViewControllers.Contains(tracker.ViewController))
                {
                    ViewControllers = ViewControllers.Remove(_trackers[page].ViewController);
                }

                _trackers.Remove(page);
            }
        }
        public nfloat?[] CalculateWidths()
        {
            var flowLayout    = ButtonBarView.CollectionViewLayout as UICollectionViewFlowLayout;
            var numberOfCells = ViewControllers.Count();

            List <nfloat> minimumCellWidths          = new List <nfloat>();
            nfloat        collectionViewContentWidth = 0;

            foreach (var viewController in ViewControllers)
            {
                var childController = viewController as IIndicatorInfoProvider;
                var indicatorInfo   = childController.IndicatorInfoForPagerTabStrip(this);

                if (ButtonBarItemSpec.NibName == null)
                {
                    nfloat width = width = ButtonBarItemSpec.WidthCallback(indicatorInfo);
                    minimumCellWidths.Add(width);
                    collectionViewContentWidth += width;
                }
                else
                {
                    nfloat width = width = ButtonBarItemSpec.WidthCallback(indicatorInfo);
                    minimumCellWidths.Add(width);
                    collectionViewContentWidth += width;
                }
            }

            var cellSpacingTotal = new nfloat(numberOfCells - 1) * flowLayout.MinimumLineSpacing;

            collectionViewContentWidth += cellSpacingTotal;

            nfloat collectionViewAvailableVisibleWidth = ButtonBarView.Frame.Size.Width - flowLayout.SectionInset.Left - flowLayout.SectionInset.Right;

            if (!Settings.Style.ButtonBarItemsShouldFillAvailiableWidth || collectionViewAvailableVisibleWidth < collectionViewContentWidth)
            {
                return(minimumCellWidths.Select(i => (nfloat?)i).ToList().ToArray());
            }
            else
            {
                var stretchedCellWidthIfAllEqual = (collectionViewAvailableVisibleWidth - cellSpacingTotal) / new nfloat(numberOfCells);
                var generalMinimumCellWidth      = CalculateStretchedCellWidths(minimumCellWidths.ToArray(), suggestedStretchedCellWidth: stretchedCellWidthIfAllEqual, previousNumberOfLargeCells: 0);

                List <nfloat> stretchedCellWidths = new List <nfloat>();
                foreach (nfloat minimumCellWidthValue in minimumCellWidths)
                {
                    var cellWidth = (minimumCellWidthValue > generalMinimumCellWidth) ? minimumCellWidthValue : generalMinimumCellWidth;
                    stretchedCellWidths.Add(cellWidth);
                }

                return(stretchedCellWidths.Select(i => (nfloat?)i).ToList().ToArray());
            }
        }