gpt4 book ai didi

ios - Xamarin:UICollection 图像重新排序问题

转载 作者:行者123 更新时间:2023-11-28 15:59:51 24 4
gpt4 key购买 nike

我正在使用 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 被调用,item 被调用重新排序。但是如果 GetPostCellSize 的宽度和高度大约为 50 或 70,即使手势被激活,PostImageColectionSource 中的 CanMoveMoveItem 未被调用,因此无法移动。

谁能希望我在单元格大小很小(例如宽度和高度为 70 左右)时重新排序 UICollectionView 中的图像。

谢谢。

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

最佳答案

这里的主要问题是您需要将 Collection View 传递给 gesture.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,它是 UICollectionViewDelegate 的组合和 UICollectionViewDataSource 在一个类中,但被分配给 Collection View 的 DataSource 属性。所有这一切意味着,尽管您可以在 PostImageColectionSource 中实现 UICollectionViewDelegate 的方法,但是由于 Delegate 的属性,不会在该类上调用委托(delegate)方法 Collection View 设置为 PostImageFlowLayout,它最终通过 UICollectionViewDelegateFlowLayoutUICollectionViewDelegate 派生。

关于ios - Xamarin:UICollection 图像重新排序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41248063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com