UICollectionView初始滞后,PagingEnabled = true

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UICollectionView初始滞后,PagingEnabled = true相关的知识,希望对你有一定的参考价值。

有我的情况:

  • 使用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

一种协议,提供集合视图的数据需求的预先警告,允许触发异步数据加载操作。

您可以在现有的基于IUICollectionViewDataSourcePrefetching的类上实现NSObject接口(我在我的集​​合视图数据源上执行)并将其分配给PrefetchDataSource属性:

CollectionView.PrefetchDataSource = this;
CollectionView.PrefetchingEnabled = true; 

注意:如果要设置PrefetchingEnabled,则不需要将PrefetchDataSource设置为true,但是您可以打开/关闭它,因此需要暂时关闭预取。

您有一个必需的方法(PrefetchItems)和一个可选的(CancelPrefetching)我强烈建议您阅读Apple文档,以便了解何时调用这些方法(不一定要为每个单元调用它们)

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不会看到它被实现而不是调用它。

Apple Doc:UICollectionViewDataSourcePrefetching

以上是关于UICollectionView初始滞后,PagingEnabled = true的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 滚动滞后于核心情节

UICollectionViewCell 中的 UICollectionView 滚动缓慢/滞后

iOS UICollectionView 在开始时滚动滞后

UICollectionView 从 NSAttributedString 图像滚动滞后/断断续续

UICollectionView 滚动 SWIFT 滞后/缓慢

Objective C uiCollectionView 滚动和加载图像让它感觉滞后