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的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionViewCell 中的 UICollectionView 滚动缓慢/滞后
UICollectionView 从 NSAttributedString 图像滚动滞后/断断续续