UICollectionView初始滞后,PagingEnabled = true

时间:2017-12-27 03:49:59

标签: ios xamarin xamarin.forms xamarin.ios uiwebview

我的情况是:

  • 使用UICollectionView和UICollectionViewFlowLayout显示许多WebView
    • PagingEnabled = true
    • 与Carousel View control相同

问题是:

  • 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;
    }
}

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

有没有办法强制它在初始加载短语中产生多少个单元?

1 个答案:

答案 0 :(得分:4)

  

UICollectionViewDataSourcePrefetching

     

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

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

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

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

您有一个必需的方法(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将不会看到它已实现而不会调用它。< / p>

Apple Doc:UICollectionViewDataSourcePrefetching