gpt4 book ai didi

ios - UICollectionView 初始滞后与 PagingEnabled = true

转载 作者:行者123 更新时间:2023-12-01 18:05:10 38 4
gpt4 key购买 nike

有我的情况:

  • 使用 UICollectionView 和 UICollectionViewFlowLayout 来显示许多 WebView
  • PagingEnabled = true
  • 与 Carousel View 控件的工作方式相同

  • 问题是:
  • WebView 从初始加载需要一点时间。第一个 webview 加载没问题。但是我向左或向右滑动,它会在完全加载之前显示一个空白页面。

  • => 预期:我不希望它在那一刻显示空白页。

    这是我的代码:
    public class CarouselWebTouch
    : UIView,
    IUICollectionViewSource,
    IUICollectionViewDelegateFlowLayout,
    ICarouselWebTouch
    {
    const string DAY_CELL_ID = "webCellId";

    IList<PageItem> Pages = new List<PageItem>();
    UICollectionView CollectionView;
    Dictionary<int, CarouselWebCell> CacheWebCell = new Dictionary<int, CarouselWebCell>();

    ...

    public CarouselWebTouch()
    {
    var layout = new UICollectionViewFlowLayout();
    layout.MinimumLineSpacing = 0;
    layout.MinimumInteritemSpacing = 0;
    layout.ScrollDirection = UICollectionViewScrollDirection.Horizontal;
    layout.SectionInset = UIEdgeInsets.Zero;
    layout.HeaderReferenceSize = CGSize.Empty;
    layout.FooterReferenceSize = CGSize.Empty;

    CollectionView = new UICollectionView(CGRect.Empty, layout);
    CollectionView.AllowsSelection = true;
    CollectionView.BackgroundColor = UIColor.Clear;
    CollectionView.PagingEnabled = true;
    CollectionView.Delegate = this;
    CollectionView.DataSource = this;
    CollectionView.ShowsHorizontalScrollIndicator = false;
    CollectionView.RegisterClassForCell(typeof(CarouselWebCell), DAY_CELL_ID);
    Add(CollectionView);
    }

    public UICollectionViewCell GetCell(UICollectionView collectionView, NSIndexPath indexPath)
    {
    var reusableCell = (CarouselWebCell)collectionView.DequeueReusableCell(DAY_CELL_ID, indexPath);
    return reusableCell;
    }
    }

    函数 GetCell 在第 0 部分的第一次初始加载中调用。我想生成它的上一个和下一个单元格。 (也意味着第 1 节)。

    有什么方法可以强制它在初始加载阶段生成单元格数量?

    最佳答案

    UICollectionViewDataSourcePrefetching

    A protocol that provides advance warning of the data requirements for a collection view, allowing the triggering of asynchronous data load operations.


    您可以实现 IUICollectionViewDataSourcePrefetching现有 NSObject 上的接口(interface)基于类(我在我的集​​合 View 数据源上执行)并将其分配给 PrefetchDataSource属性(property):
    CollectionView.PrefetchDataSource = this;
    CollectionView.PrefetchingEnabled = true;
    注意:不需要设置 PrefetchingEnabled如果要设置 PrefetchDataSource,则为 true ,但是您可以打开/关闭它,您需要暂时关闭预取是有原因的。
    您有一种必需的方法( PrefetchItems )和一种可选的方法( CancelPrefetching )和我 强烈推荐您阅读了 苹果文档 所以您了解何时调用这些方法(不一定为每个单元格调用它们)
    public void PrefetchItems(UICollectionView collectionView, NSIndexPath[] indexPaths)
    {
    foreach (var prefetch in indexPaths)
    {
    Console.WriteLine($"PreFetch {prefetch.LongRow}");
    }
    }

    [Export("collectionView:cancelPrefetchingForItemsAtIndexPaths:")]
    public void CancelPrefetching(UICollectionView collectionView, NSIndexPath[] indexPaths)
    {
    foreach (var prefetch in indexPaths)
    {
    Console.WriteLine($"Cancel PreFetch {prefetch.LongRow}");
    }
    }
    注:自 CancelPrefetching在 Xamarin/C# 界面中是可选的,您需要 Export否则 UICollectionView不会看到它被实现而不是调用它。
    苹果文档: UICollectionViewDataSourcePrefetching

    关于ios - UICollectionView 初始滞后与 PagingEnabled = true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47986111/

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