【问题标题】:Xamarin: UICollection Image reorder IssueXamarin:UICollection 图像重新排序问题
【发布时间】:2016-12-20 17:28:50
【问题描述】:

我正在使用 UICollectionView 来存储图像,我可以通过覆盖 CanMoveMoveItem 来重新排序它们。

但 UICollection 中的项目仅在单元格大小较大时重新排序,例如单元格大小约为 106 的高度和宽度,然后它们可以重新排序,如果它们的大小较小,则无法重新排序。

查看:

        public override void ViewDidLoad()
        {
            base.ViewDidLoad();
//ImageCv is the name of UiCollectionView
            var collectionLayout = new PostImageFlowLayout(3, 0.85f);
            var allCollectionSource = new PostImageColectionSource(ImageCv, (ViewModel as NewPostDetailViewModel));
            ImageCv.RegisterNibForCell(PostImageCell.Nib, PostImageCell.Key);
            ImageCv.RegisterClassForSupplementaryView(typeof(CollectionHeader), UICollectionElementKindSection.Header, new NSString("headerId"));
            ImageCv.BackgroundColor = UIColor.Clear;
            ImageCv.Hidden = false;
            ImageCv.DataSource = allCollectionSource;
            ImageCv.Delegate = collectionLayout;

            var longPressGesture = new UILongPressGestureRecognizer(gesture =>
                {
                // Take action based on state
                    switch (gesture.State)
                    {
                        case UIGestureRecognizerState.Began:
                            var selectedIndexPath = ImageCv.IndexPathForItemAtPoint(gesture.LocationInView(View));
                            if (selectedIndexPath != null)
                                ImageCv.BeginInteractiveMovementForItem(selectedIndexPath);

                            Debug.WriteLine("Gesture Recognition: Activated");
                            break;
                        case UIGestureRecognizerState.Changed:
                            ImageCv.UpdateInteractiveMovement(gesture.LocationInView(View));

                            Debug.WriteLine("Gesture activated: Item location is changed");
                            break;
                        case UIGestureRecognizerState.Ended:
                            ImageCv.EndInteractiveMovement();
                            Debug.WriteLine("Gesture activation: complete");
                            break;
                        default:
                            ImageCv.CancelInteractiveMovement();
                            Debug.WriteLine("Gesture activation: Terminate");
                            break;
                    }
                });

            // Add the custom recognizer to the collection view
            ImageCv.AddGestureRecognizer(longPressGesture);
}

UICollectionViewDelegateFlowLayout 使用系统; 使用 System.Windows.Input; 使用核心图形; 使用 UIKit;

namespace Sources.CollectionSources
{
    public class PostImageFlowLayout : UICollectionViewDelegateFlowLayout
    {
        private float headerHeight;
        private int noOfItems; 


        private bool isLoading; 

        public PostImageFlowLayout(int noOfItems, float headerHeight = 0f)
        {
            this.noOfItems = noOfItems;
            this.headerHeight = headerHeight;
        } 
        public override CGSize GetSizeForItem(UICollectionView collectionView, UICollectionViewLayout layout, Foundation.NSIndexPath indexPath)
        {
            return GetPostCellSize();
        }

        public override CGSize GetReferenceSizeForHeader(UICollectionView collectionView, UICollectionViewLayout layout, nint section)
        {
            return new CGSize(collectionView.Frame.Width, headerHeight);
        }

        public override UIEdgeInsets GetInsetForSection(UICollectionView collectionView, UICollectionViewLayout layout, nint section)
        {
            return new UIEdgeInsets(0, 0, 0, 0);
        }

        private CGSize GetPostCellSize()
        {
            var relativeWidth = (UIScreen.MainScreen.Bounds.Width - 2) / this.noOfItems;
            return new CGSize(relativeWidth, relativeWidth);

            //return new CGSize(55, 55);
        } 

    }
}

来源

public class PostImageColectionSource : MvxCollectionViewSource
    {
        private NewPostDetailViewModel newPostDetailViewModel;
        private string type;

        static NSString animalCellId = new NSString("PostImageCell");
        static NSString headerId = new NSString("Header");
        List<IAnimal> animals;

        protected override NSString DefaultCellIdentifier
        {
            get
            {
                return PostImageCell.Key;
            }
        }

        public override System.Collections.IEnumerable ItemsSource
        {
            get
            {
                return base.ItemsSource;
            }
            set
            {
                base.ItemsSource = value;
                CollectionView.ReloadData();
            }
        }


        public PostImageColectionSource(UICollectionView collectionView, NewPostDetailViewModel newPostDetailViewModel) : base(collectionView)
        {
            this.newPostDetailViewModel = newPostDetailViewModel;
            animals = new List<IAnimal>();
            for (int i = 0; i < 20; i++)
            {
                animals.Add(new Monkey(i));
            }
        }

        public override nint NumberOfSections(UICollectionView collectionView)
        {
            return 1;
        }

        public override nint GetItemsCount(UICollectionView collectionView, nint section)
        {
            return 5;// animals.Count;
        }

        public override UICollectionViewCell GetCell(UICollectionView collectionView, NSIndexPath indexPath)
        {
            var cell = (PostImageCell)collectionView.DequeueReusableCell(animalCellId, indexPath);
            var animal = animals[indexPath.Row];
            cell.Result(indexPath.Row);
            return cell;
        }

        public override bool CanMoveItem(UICollectionView collectionView, NSIndexPath indexPath)
        {
            Debug.WriteLine("Ready to move images");
            //System.Diagnostics.Debug.WriteLine("Checking if it can move the item");
            return true;
        }

        public override void MoveItem(UICollectionView collectionView, NSIndexPath sourceIndexPath, NSIndexPath destinationIndexPath)
        {
            //base.MoveItem(collectionView, sourceIndexPath, destinationIndexPath);
            Debug.WriteLine("Start moving images to reorder");
            var item = animals[(int)sourceIndexPath.Item];
            animals.RemoveAt((int)sourceIndexPath.Item);
            animals.Insert((int)destinationIndexPath.Item, item);
        }
    }

当 PostImageFlowLayout 中的 GetPostCellSize 的宽度和高度约为 100 时,将调用 PostImageColectionSource 中的 CanMoveMoveItem 并对项目进行重新排序。但是,如果GetPostCellSize 的宽度和高度约为 50 或 70,即使激活了手势,PostImageColectionSource 中的 CanMoveMoveItem 也不会被调用,因此无法移动。

当单元格尺寸很小(例如宽度和高度约为 70)时,谁能希望我重新排序 UICollectionView 中的图像。

谢谢。

我正在标记 swift 和 Objective-C,因为这个问题通常与 IOS 相关,而不是特定于 xamarin

【问题讨论】:

  • 实在是乱七八糟,看不懂。您是否只想通过“拖放”对 UICollectionView 中的项目进行排序?

标签: ios objective-c swift xamarin xamarin.ios


【解决方案1】:

这里的主要问题是您需要将集合视图传递给手势。LocationInView(View) 调用而不是主视图。在 ViewDidLoad 中的 UILongPressGestureRecognizer 更改:

var selectedIndexPath = ImageCv.IndexPathForItemAtPoint(gesture.LocationInView(View));

ImageCv.UpdateInteractiveMovement(gesture.LocationInView(View));

var selectedIndexPath = ImageCv.IndexPathForItemAtPoint(gesture.LocationInView(ImageCv)); // <-- pass in ImageCV instead of View. (where ImageCV is the collection view)

ImageCv.UpdateInteractiveMovement(gesture.LocationInView(ImageCv)); // <-- pass in ImageCV instead of View.

另一件需要注意但不是什么大问题的事情是PostImageColectionSource 最终派生自UICollectionViewSource,这是UICollectionViewDelegateUICollectionViewDataSource 在一个类中的组合,但被分配给@ 987654330@ 集合视图的属性。这意味着尽管您可以在PostImageColectionSource 中实现UICollectionViewDelegate 的方法,但不会在该类上调用委托方法,因为集合视图的Delegate 属性设置为PostImageFlowLayout,它最终派生自UICollectionViewDelegate 通过UICollectionViewDelegateFlowLayout

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    相关资源
    最近更新 更多