Ejemplo n.º 1
0
        /**
         * Adds screen edge gestures to a view to present a menu.
         *
         * - Parameter toView: The view to add gestures to.
         * - Parameter forMenu: The menu (left or right) you want to add a gesture for. If unspecified, gestures will be added for both sides.
         *
         * - Returns: The array of screen edge gestures added to `toView`.
         */
        public List <UIScreenEdgePanGestureRecognizer> AddScreenEdgePanGesturesToPresent(UIView toView, UIRectEdge?forMenu = null)
        {
            var gestures = new List <UIScreenEdgePanGestureRecognizer>();

            if (forMenu != UIRectEdge.Right)
            {
                var leftScreenEdgeGestureRecognizer = new UIScreenEdgePanGestureRecognizer();
                leftScreenEdgeGestureRecognizer.AddTarget(/*SideMenuTransition.Current, */ (_) => SideMenuTransition.HandlePresentMenuLeftScreenEdge(leftScreenEdgeGestureRecognizer));
                leftScreenEdgeGestureRecognizer.Edges = UIRectEdge.Left;
                leftScreenEdgeGestureRecognizer.CancelsTouchesInView = true;
                toView.AddGestureRecognizer(leftScreenEdgeGestureRecognizer);
                gestures.Add(leftScreenEdgeGestureRecognizer);
            }

            if (forMenu != UIRectEdge.Left)
            {
                var rightScreenEdgeGestureRecognizer = new UIScreenEdgePanGestureRecognizer();
                rightScreenEdgeGestureRecognizer.AddTarget(/*SideMenuTransition.Current, */ (_) => SideMenuTransition.HandlePresentMenuRightScreenEdge(rightScreenEdgeGestureRecognizer));
                rightScreenEdgeGestureRecognizer.Edges = UIRectEdge.Right;
                rightScreenEdgeGestureRecognizer.CancelsTouchesInView = true;
                toView.AddGestureRecognizer(rightScreenEdgeGestureRecognizer);
                gestures.Add(rightScreenEdgeGestureRecognizer);
            }

            return(gestures);
        }
 void InteractiveTransitionRecognizerAction(UIScreenEdgePanGestureRecognizer sender)
 {
     if (sender.State == UIGestureRecognizerState.Began)
     {
         PerformSegue("BackToFirstViewController", sender);
     }
 }
 void InteractiveTransitionRecognizerAction(UIScreenEdgePanGestureRecognizer sender)
 {
     if (sender.State == UIGestureRecognizerState.Began)
     {
         PerformSegue("CustomTransition", sender);
     }
 }
        //https://stackoverflow.com/a/26569703/1981314
        void HandleRecognizer(UIScreenEdgePanGestureRecognizer recognizer, UINavigationController navigationController)
        {
            var translate = recognizer.TranslationInView(recognizer.View);
            var percent   = translate.X / recognizer.View.Bounds.Width * 2;
            var velocity  = recognizer.VelocityInView(recognizer.View);

            if (percent > 1)
            {
                percent = 1;
            }

            if (recognizer.State == UIGestureRecognizerState.Began)
            {
                interactor = new UIPercentDrivenInteractiveTransition();
                navigationController.PopViewController(true);
            }

            else if (recognizer.State == UIGestureRecognizerState.Changed)
            {
                interactor.UpdateInteractiveTransition(percent);
            }

            else if (recognizer.State == UIGestureRecognizerState.Ended)
            {
                if (percent > 0.5 || velocity.X > 0)
                {
                    interactor.FinishInteractiveTransition();
                }
                else
                {
                    interactor.CancelInteractiveTransition();
                }
                interactor = null;
            }
        }
        public SwipeTransitionInteractionController(UIScreenEdgePanGestureRecognizer gestureRecognizer, UIRectEdge edge)
        {
            GestureRecognizer = gestureRecognizer;
            Edge = edge;

            GestureRecognizer.AddTarget(() => GestureRecognizeDidUpdate(GestureRecognizer));
        }
        void Initialize(UITableViewStyle navigationStyle = UITableViewStyle.Plain)
        {
            navigation = new DialogViewController(navigationStyle, null);
            navigation.TableView.AccessibilityIdentifier = "FlyoutMenu";
            var navFrame = navigation.View.Frame;

            navFrame.Width = menuWidth;
            if (Position == FlyOutNavigationPosition.Right)
            {
                navFrame.X = mainView.Frame.Width - menuWidth;
            }
            navigation.View.Frame = navFrame;
            View.AddSubview(navigation.View);
            AddChildViewController(navigation);

            TintColor = UIColor.Black;
            var version = new System.Version(UIDevice.CurrentDevice.SystemVersion);

            isIos8 = version.Major >= 8;
            isIos7 = version.Major >= 7;
            if (isIos7)
            {
                navigation.TableView.TableHeaderView =
                    new UIView(new CGRect(0, 0, 320, 22))
                {
                    BackgroundColor = UIColor.Clear
                };
            }
            navigation.TableView.TableFooterView = new UIView(new CGRect(0, 0, 100, 100))
            {
                BackgroundColor = UIColor.Clear
            };


            navigation.TableView.ScrollsToTop = false;
            shadowView = new UIView()
            {
                AccessibilityLabel = "flyOutShadowLayeLabel", IsAccessibilityElement = true
            };
            shadowView.BackgroundColor    = UIColor.Clear;
            shadowView.Layer.ShadowOffset = new CGSize(Position == FlyOutNavigationPosition.Left ? -5 : 5, -1);
            shadowView.Layer.ShadowColor  = UIColor.Black.CGColor;

            shadowView.Layer.ShadowOpacity = .75f;
            closeButton = new UIButton();
            closeButton.AccessibilityHint  = closeButton.AccessibilityIdentifier = "CloseMenu";
            closeButton.AccessibilityLabel = "Close Menu";
            closeButton.TouchUpInside     += CloseButtonTapped;

            AlwaysShowLandscapeMenu             = true;
            NavigationOpenedByLandscapeRotation = false;

            View.AddGestureRecognizer(openGesture = new UIScreenEdgePanGestureRecognizer(() => DragContentView(openGesture))
            {
                Edges = Position == FlyOutNavigationPosition.Left ? UIRectEdge.Left : UIRectEdge.Right
            });
            View.AddGestureRecognizer(closeGesture = new OpenMenuGestureRecognizer(DragContentView, shouldReceiveTouch));
        }
Ejemplo n.º 7
0
        void InteractiveTransitionRecognizerAction(UIScreenEdgePanGestureRecognizer sender, bool presentedValue)
        {
            // If we get swipe from the left edge, we show the menu.

            if (sender.State == UIGestureRecognizerState.Began)
            {
                SetPresentedValue(presentedValue);
            }
        }
Ejemplo n.º 8
0
        void InteractiveTransitionRecognizerAction(UIScreenEdgePanGestureRecognizer sender, IReadOnlyList <Page> pageStack)
        {
            var percent = sender.TranslationInView(sender.View).X / sender.View.Frame.Width;
            var finishTransitionOnEnd = percent > 0.5 || sender.VelocityInView(sender.View).X > 300;

            _renderer.EdgeGesturePanned(new EdgeGesturePannedArgs
            {
                State   = sender.State,
                Percent = percent,
                FinishTransitionOnEnd = finishTransitionOnEnd
            });

            switch (sender.State)
            {
            case UIGestureRecognizerState.Began:
                _renderer.PercentDrivenInteractiveTransition = new UIPercentDrivenInteractiveTransition();
                ((UINavigationController)_renderer).PopViewController(true);
                break;

            case UIGestureRecognizerState.Changed:
                _renderer.PercentDrivenInteractiveTransition.UpdateInteractiveTransition(percent);
                break;

            case UIGestureRecognizerState.Cancelled:
            case UIGestureRecognizerState.Failed:
                _renderer.PercentDrivenInteractiveTransition.CancelInteractiveTransition();
                _renderer.PercentDrivenInteractiveTransition = null;
                break;

            case UIGestureRecognizerState.Ended:
                if (finishTransitionOnEnd)
                {
                    _renderer.PercentDrivenInteractiveTransition.FinishInteractiveTransition();

                    /*
                     * IMPORTANT!
                     *
                     * at the end of this transition, we need to check if we want a normal pop gesture or the custom one for the new page
                     * as we said before, the custom pop gesture doesnt play well with "normal" pages.
                     * So, at the end of the transition, we check if a page exists before the one we are opening and then check the mapstack
                     * If the previous page of the pop destination doesnt have shared transitions, we remove our custom gesture
                     */
                    var pageCount = pageStack.Count;
                    if (pageCount > 2 && _renderer.TransitionMap.GetMap(pageStack[pageCount - 3], null).Count == 0)
                    {
                        RemoveInteractiveTransitionRecognizer();
                    }
                }
                else
                {
                    _renderer.PercentDrivenInteractiveTransition.CancelInteractiveTransition();
                }
                _renderer.PercentDrivenInteractiveTransition = null;
                break;
            }
        }
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            var interactiveTransitionRecognizer = new UIScreenEdgePanGestureRecognizer();

            interactiveTransitionRecognizer.AddTarget(() => InteractiveTransitionRecognizerAction(interactiveTransitionRecognizer));
            interactiveTransitionRecognizer.Edges = UIRectEdge.Left;
            View.AddGestureRecognizer(interactiveTransitionRecognizer);
        }
Ejemplo n.º 10
0
        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            View.Apply (Style.Screen);
            NavigationBar.Apply (Style.NavigationBar);
            Delegate = navDelegate = new NavDelegate ();

            InteractivePopGestureRecognizer.ShouldBegin = GestureRecognizerShouldBegin;

            interactiveEdgePanGestureRecognizer = new UIScreenEdgePanGestureRecognizer (OnEdgePanGesture) {
                Edges = UIRectEdge.Left,
                ShouldBegin = GestureRecognizerShouldBegin,
            };
            View.AddGestureRecognizer (interactiveEdgePanGestureRecognizer);
        }
Ejemplo n.º 11
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            View.Apply(Style.Screen);
            NavigationBar.Apply(Style.NavigationBar);
            Delegate = navDelegate = new NavDelegate();

            InteractivePopGestureRecognizer.ShouldBegin = GestureRecognizerShouldBegin;

            interactiveEdgePanGestureRecognizer = new UIScreenEdgePanGestureRecognizer(OnEdgePanGesture)
            {
                Edges       = UIRectEdge.Left,
                ShouldBegin = GestureRecognizerShouldBegin,
            };
            View.AddGestureRecognizer(interactiveEdgePanGestureRecognizer);
        }
Ejemplo n.º 12
0
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            // Attach the Edge Gesture.
            var edgeSwipeOpenRecognizer = new UIScreenEdgePanGestureRecognizer();

            edgeSwipeOpenRecognizer.AddTarget(() => InteractiveTransitionRecognizerAction(edgeSwipeOpenRecognizer, true));
            edgeSwipeOpenRecognizer.Edges = UIRectEdge.Left;
            View.AddGestureRecognizer(edgeSwipeOpenRecognizer);

            var edgeSwipeCloseRecognizer = new UIScreenEdgePanGestureRecognizer();

            edgeSwipeCloseRecognizer.AddTarget(() => InteractiveTransitionRecognizerAction(edgeSwipeCloseRecognizer, false));
            edgeSwipeCloseRecognizer.Edges = UIRectEdge.Right;
            View.AddGestureRecognizer(edgeSwipeCloseRecognizer);
        }
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            var screenEdgePanGestureRecognizer = new UIScreenEdgePanGestureRecognizer()
            {
                Edges = UIRectEdge.Left
            };

            screenEdgePanGestureRecognizer.AddTarget(() => SlideToOpenMasterViewController(screenEdgePanGestureRecognizer));

            View.AddGestureRecognizer(screenEdgePanGestureRecognizer);

            if (DetailViewController == null)
            {
                return;
            }

            AttachDetaiViewController();
        }
        nfloat PercentForGesture(UIScreenEdgePanGestureRecognizer gesture)
        {
            if (TransitionContext == null)
            {
                return(0f);
            }

            UIView transitionContainerView = TransitionContext.ContainerView;
            var    locationInSourceView    = gesture.LocationInView(transitionContainerView);

            nfloat width  = 0f;
            nfloat height = 0f;

            if (transitionContainerView != null)
            {
                width  = transitionContainerView.Bounds.Width;
                height = transitionContainerView.Bounds.Height;
            }

            if (Edge == UIRectEdge.Right)
            {
                return((width - locationInSourceView.X) / width);
            }

            if (Edge == UIRectEdge.Left)
            {
                return(locationInSourceView.X / width);
            }

            if (Edge == UIRectEdge.Bottom)
            {
                return((height - locationInSourceView.Y) / height);
            }

            if (Edge == UIRectEdge.Top)
            {
                return(locationInSourceView.Y / height);
            }

            return(0);
        }
Ejemplo n.º 15
0
        void Initialize(UIViewController navigationController = null)
        {
            NavigationViewController = navigationController ?? new UIViewController();
            NavigationViewController.View.AccessibilityIdentifier = "FlyoutMenu";

            var navFrame = NavigationViewController.View.Frame;

            navFrame.Width = menuWidth;
            if (Position == FlyOutNavigationPosition.Right)
            {
                navFrame.X = mainView.Frame.Width - menuWidth;
            }
            NavigationViewController.View.Frame = navFrame;

            View.AddSubview(NavigationViewController.View);
            AddChildViewController(NavigationViewController);

            shadowView = new UIView()
            {
                AccessibilityLabel = "flyOutShadowLayeLabel", IsAccessibilityElement = true
            };
            shadowView.BackgroundColor     = UIColor.Clear;
            shadowView.Layer.ShadowOffset  = new CGSize(Position == FlyOutNavigationPosition.Left ? -5 : 5, -1);
            shadowView.Layer.ShadowColor   = UIColor.Black.CGColor;
            shadowView.Layer.ShadowOpacity = .75f;

            closeButton = new UIButton();
            closeButton.AccessibilityHint  = closeButton.AccessibilityIdentifier = "CloseMenu";
            closeButton.AccessibilityLabel = "Close Menu";
            closeButton.TouchUpInside     += CloseButtonTapped;

            AlwaysShowLandscapeMenu             = true;
            NavigationOpenedByLandscapeRotation = false;

            View.AddGestureRecognizer(openGesture = new UIScreenEdgePanGestureRecognizer(() => DragContentView(openGesture))
            {
                Edges = Position == FlyOutNavigationPosition.Left ? UIRectEdge.Left : UIRectEdge.Right
            });
            View.AddGestureRecognizer(closeGesture = new OpenMenuGestureRecognizer(DragContentView, shouldReceiveTouch));
        }
        public override IUIViewControllerAnimatedTransitioning GetAnimationControllerForOperation(
            UINavigationController navigationController, UINavigationControllerOperation operation, UIViewController fromViewController, UIViewController toViewController)
        {
            //TODO: remove dependency on CitySelectViewController with interface or something else
            if (operation == UINavigationControllerOperation.Push && fromViewController is HomePageController vc1)
            {
                //Recognizer is added only on push so that user can interactively pop the presented screen.
                var recognizer = new UIScreenEdgePanGestureRecognizer();
                recognizer.Edges = UIRectEdge.Left;
                recognizer.AddTarget(() =>
                {
                    HandleRecognizer(recognizer, navigationController);
                });
                toViewController.View.AddGestureRecognizer(recognizer);
                return(new CustomTransition(operation, vc1.AnimationSourceView));
            }
            else if (operation == UINavigationControllerOperation.Pop && toViewController is HomePageController vc2)
            {
                return(new CustomTransition(operation, vc2.AnimationSourceView));
            }

            return(null);
        }
        void GestureRecognizeDidUpdate(UIScreenEdgePanGestureRecognizer sender)
        {
            switch (sender.State)
            {
            case UIGestureRecognizerState.Changed:
                UpdateInteractiveTransition(PercentForGesture(sender));
                break;

            case UIGestureRecognizerState.Ended:
                if (PercentForGesture(sender) >= 0.5)
                {
                    FinishInteractiveTransition();
                }
                else
                {
                    CancelInteractiveTransition();
                }
                break;

            default:
                CancelInteractiveTransition();
                break;
            }
        }
Ejemplo n.º 18
0
 public void HandlePresentMenuRightScreenEdge(UIScreenEdgePanGestureRecognizer edge)
 {
     this.PresentDirection = UIRectEdge.Right;
     HandlePresentMenuPan(edge);
 }
		void Initialize(UITableViewStyle navigationStyle = UITableViewStyle.Plain)
		{
			navigation = new DialogViewController (navigationStyle, null);
			navigation.TableView.AccessibilityIdentifier = "FlyoutMenu";
			var navFrame = navigation.View.Frame;
			navFrame.Width = menuWidth;
			if (Position == FlyOutNavigationPosition.Right)
				navFrame.X = mainView.Frame.Width - menuWidth;
			navigation.View.Frame = navFrame;
			View.AddSubview(navigation.View);

			TintColor = UIColor.Black;
			var version = new System.Version(UIDevice.CurrentDevice.SystemVersion);
			isIos8 = version.Major >= 8;
			isIos7 = version.Major >= 7;
			if(isIos7){
				navigation.TableView.TableHeaderView = 
					new UIView (new CGRect (0, 0, 320, 22)) {
					BackgroundColor = UIColor.Clear
				};
			}
			navigation.TableView.TableFooterView = new UIView(new CGRect(0, 0, 100, 100)) {BackgroundColor = UIColor.Clear};


			navigation.TableView.ScrollsToTop = false;
			shadowView = new UIView(){AccessibilityLabel = "flyOutShadowLayeLabel" , IsAccessibilityElement = true};
			shadowView.BackgroundColor = UIColor.Clear;
			shadowView.Layer.ShadowOffset = new CGSize(Position == FlyOutNavigationPosition.Left ? -5 : 5, -1);
			shadowView.Layer.ShadowColor = UIColor.Black.CGColor;

			shadowView.Layer.ShadowOpacity = .75f;
			closeButton = new UIButton ();
			closeButton.AccessibilityHint = closeButton.AccessibilityIdentifier ="CloseMenu";
			closeButton.AccessibilityLabel = "Close Menu";
			closeButton.TouchUpInside += CloseButtonTapped;

			AlwaysShowLandscapeMenu = true;
			NavigationOpenedByLandscapeRotation = false;

			View.AddGestureRecognizer (openGesture = new UIScreenEdgePanGestureRecognizer(() => DragContentView (openGesture)){Edges = Position == FlyOutNavigationPosition.Left ? UIRectEdge.Left : UIRectEdge.Right});
			View.AddGestureRecognizer (closeGesture = new OpenMenuGestureRecognizer (DragContentView, shouldReceiveTouch));
		}