private void UpdateContentOffset(bool animated, PagerScroll pagerScroll, CGRect toFrame, int toIndex)
 {
     if (pagerScroll != PagerScroll.No || (pagerScroll != PagerScroll.ScrollOnlyIfOutOfScreen && (toFrame.X < ContentOffset.X || toFrame.X >= (ContentOffset.X + Frame.Size.Width - ContentInset.Left))))
     {
         nfloat targetContentOffset = ContentSize.Width > Frame.Size.Width ? ContentOffsetForCell(toFrame, toIndex) : 0;
         SetContentOffset(new CGPoint(targetContentOffset, 0), animated);
     }
 }
        public void Move(nint fromIndex, nint toIndex, nfloat progressPercentage, PagerScroll pagerScroll)
        {
            SelectedIndex = progressPercentage > 0.5f ? toIndex : fromIndex;

            var fromFrame     = GetLayoutAttributesForItem(NSIndexPath.FromItemSection(fromIndex, 0)).Frame;
            var numberOfItems = DataSource.GetItemsCount(this, 0);

            CGRect toFrame;

            if (toIndex < 0 || toIndex > numberOfItems - 1)
            {
                if (toIndex < 0)
                {
                    var cellAtts = GetLayoutAttributesForItem(NSIndexPath.FromItemSection(0, 0));
                    toFrame = cellAtts.Frame;
                    toFrame.Offset(-cellAtts.Frame.Width, 0);
                }
                else
                {
                    var cellAtts = GetLayoutAttributesForItem(NSIndexPath.FromItemSection(numberOfItems - 1, 0));
                    toFrame = cellAtts.Frame;
                    toFrame.Offset(cellAtts.Frame.Width, 0);
                }
            }
            else
            {
                toFrame = GetLayoutAttributesForItem(NSIndexPath.FromItemSection(toIndex, 0)).Frame;
            }

            var targetFrame = fromFrame;

            targetFrame.Height = SelectedBar.Frame.Height;
            targetFrame.Width += (toFrame.Size.Width - fromFrame.Size.Width) * progressPercentage;
            targetFrame.X     += (toFrame.X - fromFrame.X) * progressPercentage;

            SelectedBar.Frame = new CGRect(targetFrame.X, SelectedBar.Frame.Y, targetFrame.Width, SelectedBar.Frame.Height);

            nfloat targetContentOffset = 0.0f;

            if (ContentSize.Width > Frame.Width)
            {
                var toContentOffset   = ContentOffsetForCell(toFrame, toIndex);
                var fromContentOffset = ContentOffsetForCell(fromFrame, fromIndex);

                targetContentOffset = fromContentOffset + ((toContentOffset - fromContentOffset) * progressPercentage);
            }

            var animated = Math.Abs(ContentOffset.X - targetContentOffset) > 30 || (fromIndex == toIndex);

            SetContentOffset(new CGPoint(targetContentOffset, 0), animated);
        }
 public void MoveToIndex(int toIndex, bool animated, SwipeDirection swipeDirection, PagerScroll pagerScroll)
 {
     selectedIndex = toIndex;
     UpdateSelectedBarPosition(animated, swipeDirection: swipeDirection, pagerScroll: pagerScroll);
 }
        public void UpdateSelectedBarPosition(bool animated, SwipeDirection swipeDirection, PagerScroll pagerScroll)
        {
            var selectedBarFrame = SelectedBar.Frame;

            NSIndexPath selectedCellIndexPath           = NSIndexPath.FromItemSection(new nint(selectedIndex), 0);
            UICollectionViewLayoutAttributes attributes = GetLayoutAttributesForItem(selectedCellIndexPath);
            CGRect selectedCellFrame = attributes.Frame;

            UpdateContentOffset(animated, pagerScroll: pagerScroll, toFrame: selectedCellFrame, toIndex: selectedCellIndexPath.Row);

            selectedBarFrame.Size = new CGSize(selectedCellFrame.Size.Width, selectedBarFrame.Size.Height);
            selectedBarFrame.X    = selectedCellFrame.X;

            if (animated)
            {
                UIView.Animate(0.3, () =>
                {
                    SelectedBar.Frame = selectedBarFrame;
                });
            }
            else
            {
                SelectedBar.Frame = selectedBarFrame;
            }
        }
        public void MoveFromIndex(int fromIndex, int toIndex, nfloat progressPercentage, PagerScroll pagerScroll)
        {
            selectedIndex = progressPercentage > 0.5 ? toIndex : fromIndex;

            CGRect fromFrame     = GetLayoutAttributesForItem(NSIndexPath.FromItemSection(fromIndex, 0)).Frame;
            var    numberOfItems = DataSource.GetItemsCount(this, 0);

            CGRect toFrame;

            if (toIndex < 0 || toIndex > numberOfItems - 1)
            {
                if (toIndex < 0)
                {
                    var cellAtts = GetLayoutAttributesForItem(NSIndexPath.FromItemSection(0, 0));
                    toFrame = CGRect.Inflate(cellAtts.Frame, -cellAtts.Frame.Size.Width, 0);
                }
                else
                {
                    var cellAtts = GetLayoutAttributesForItem(NSIndexPath.FromItemSection((numberOfItems - 1), 0));
                    toFrame = CGRect.Inflate(cellAtts.Frame, cellAtts.Frame.Size.Width, 0);
                }
            }
            else
            {
                toFrame = GetLayoutAttributesForItem(NSIndexPath.FromItemSection(toIndex, 0)).Frame;
            }


            CGRect targetFrame = fromFrame;

            if (this.SelectedBarWidth.HasValue)
            {
                targetFrame.Size = new CGSize(this.SelectedBarWidth.Value, SelectedBar.Frame.Size.Height);
                targetFrame.X    = fromFrame.X + (fromFrame.Width - this.SelectedBarWidth.Value) / 2;
                targetFrame.X   += (toFrame.X + (toFrame.Width - this.SelectedBarWidth.Value) / 2 - targetFrame.X) * progressPercentage;
            }
            else
            {
                var targetWidth = targetFrame.Size.Width + (toFrame.Size.Width - fromFrame.Size.Width) * progressPercentage;
                targetFrame.Size = new CGSize(targetWidth, SelectedBar.Frame.Size.Height);
                targetFrame.X   += (toFrame.X - fromFrame.X) * progressPercentage;
            }

            SelectedBar.Frame = new CGRect(targetFrame.X, SelectedBar.Frame.Y, targetFrame.Size.Width, SelectedBar.Frame.Size.Height);

            nfloat targetContentOffset = 0.0f;

            if (ContentSize.Width > Frame.Size.Width)
            {
                var toContentOffset   = ContentOffsetForCell(toFrame, toIndex);
                var fromContentOffset = ContentOffsetForCell(fromFrame, fromIndex);

                targetContentOffset = fromContentOffset + ((toContentOffset - fromContentOffset) * progressPercentage);
            }

            SetContentOffset(new CGPoint(targetContentOffset, 0), animated: false);
        }
 public void MoveTo(nint index, bool animated, SwipeDirection swipeDirection, PagerScroll pagerScroll)
 {
     SelectedIndex = index;
     UpdateSelectedBarPosition(animated, swipeDirection, pagerScroll);
 }
        private void UpdateSelectedBarPosition(bool animated, SwipeDirection swipeDirection, PagerScroll pagerScroll)
        {
            var selectedBarFrame = SelectedBar.Frame;

            var selectedCellIndexPath = NSIndexPath.FromItemSection(SelectedIndex, 0);
            var attributes            = GetLayoutAttributesForItem(selectedCellIndexPath);
            var selectedCellFrame     = attributes.Frame;

            UpdateContentOffset(animated, pagerScroll, selectedCellFrame, (selectedCellIndexPath as NSIndexPath).Row);

            selectedBarFrame.Width = selectedCellFrame.Width;
            selectedBarFrame.X     = selectedCellFrame.X;

            if (animated)
            {
                UIView.Animate(duration: 0.3, animation: () =>
                {
                    this.SelectedBar.Frame = selectedBarFrame;
                });
            }
            else
            {
                SelectedBar.Frame = selectedBarFrame;
            }
        }