При быстрой прокрутке прокрутки я не уверен, что содержимое загружается недостаточно быстро или рисунок пропускается, поскольку я генерирую новые подпредставления из проверки scrollViewDidEndDecelerating: (есть ли лучший метод?) Быстрая прокрутка не требуется! - я просто хочу решить проблемы, которые он вызывает.
Более длинное объяснение: у меня есть прокрутка с большим размером содержимого и включенным пейджингом. Для данной страницы добавляются три подпредставления с началом кадра в -1, 0, +1, умноженном на размер кадра (таким образом, средний кадр виден, остальные — следующая и предыдущая страница). Frame -1 и +1 — это ImageView, Frame 0 — это еще один UIScrollView с собственным подпредставлением ImageView. Они не являются подклассами.
По соображениям производительности мой подход состоит в том, чтобы проверить, движется ли прокрутка вперед или назад, и загрузить только новое изображение, поскольку два других уже загружены, я сохраняю их, например. «UIImage *tempImg1 = previousPageImageView.image» и возьмите их оттуда, как только будут добавлены подпредставления.
Теперь быстрая прокрутка приводит к тому, что новое изображение не появляется, но, что еще хуже, программа путается, по какому индексу оно должно быть, и вылетает. Я попробовал это с маленькими картинками, но та же проблема.
Пользователю не обязательно разрешена быстрая прокрутка, вероятно, будет достаточно игнорировать дальнейшие жесты смахивания после начала перемещения страницы до завершения загрузки.
Большое спасибо за идеи.
загрузка страницы:
-(void)loadSVforPage:(int)page
{
int nextSVpage = page +1;
int previousSVpage = page -1;
int numberOfAssets = assets.count;
ALAsset *displayAsset;
ALAssetRepresentation *assetRep;
CGFloat SVwidth = scrollLarge.frame.size.width;
CGFloat SVheight = scrollLarge.frame.size.height;
UIImage *tempImg1;
UIImage *tempImg2;
UIImage *tempImg3;
UIImage *displayed;
if (page != currentpage)
{
// if moves are +1 or -1 use temp images, else load all
if (page == currentpage +1) // moving forward
{
//NSLog(@"page+");
tempImg1 = nextSVImg; // the former "next", which now becomes current
tempImg3 = currentSVImg; // the former "current", which now becomes previous
if ((page+1 >=0) && (page+1 <= assets.count-1))
{
displayAsset = [assets objectAtIndex:page+1]; // the "new next" image
assetRep = [displayAsset defaultRepresentation];
tempImg2 = [ImageProcessing fullSizeImageForAssetRepresentation:assetRep];
}
}
else if (page == currentpage -1) // moving backwards
....
....
....
// LOAD PAGE+1
if (nextSVpage <= numberOfAssets-1)
{
displayed = tempImg2;
nextSVImg = displayed; // store the image for future scrolls
CGRect frame = CGRectMake(nextSVpage * SVwidth, 0, SVwidth, SVheight);
//old code adding UIImageViews
//------------------------------
//nextScrollImageView = [[UIImageView alloc]initWithFrame:frame];
//[completeScrollableImageView addSubview:nextScrollImageView];
//nextScrollImageView.image = displayed;
// new code with subclassed UIView and image in drawRect
//-------------------------------
scrollUIViewNext = [[scrollviewImage alloc]initWithFrame:frame andImage:displayed];
[completeScrollableImageView addSubview:scrollUIViewNext];
....
....
....
триггерная нагрузка:
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
if (scrollView.tag == 0) // the base SV
{
int pageNumber = floor(scrollView.contentOffset.x / scrollView.frame.size.width + 0.5);//+1;
if (pageNumber != currentpage)
{
//NSLog(@"moved from current %i to %i",currentpage,pageNumber);
[self loadSVforPage:pageNumber];
}
}
}