У меня возникла проблема перерисовки в CATiledLayer, когда родительский UIScrollView увеличен.
Я визуализирую страницу PDF в UIView, поддерживаемом CATiledLayer. За ним стоит еще один UIImageView, который содержит изображение страницы с низким разрешением, которое будет отрисовывать CATiledLayer. Когда я увеличиваю масштаб, он работает так, как ожидалось. CATiledLayer будет отображать изображение с более высоким разрешением в соответствии с уровнем масштабирования.
Проблема возникает после масштабирования. Если я увеличу масштаб, просто оставлю iPad в покое, отображаемое изображение размывается, а затем резко меняется. Похоже, что CATiledLayer удаляется, так как я вижу размытое изображение с низким разрешением в фоновом режиме, затем CATiledLayer перерисовывается, т.е.Я вижу эффект плитки и изменение резкости изображения. Это происходит, если я просто оставлю приложение в покое и подожду от 30 до 40 секунд. Я наблюдал это только на iPad 3-го поколения (новый iPad, iPad3 и т. д.). Я также тестирую iPad2 и еще не сталкивался с проблемой.
Кто-нибудь еще сталкивался с этой проблемой? Любая известная причина и, возможно, решения?
Редактировать:
Мои методы UIScrollViewDelegate следующие:
// currentPage, previousPage, and nextPage are the pdf page views
// that are having the refresh problem
- (void)positionBufferedPages {
// performs math {code omitted}
// then sets the center of the views
[previousPage.view setCenter:...];
[nextPage.view setCenter:...];
}
- (void)hideBufferedPages {
if ([previousPage.view isDescendantOfView:scrollView]) {
[previousPage.view removeFromSuperview];
}
if ([nextPage.view isDescendantOfView:scrollView]) {
[nextPage.view removeFromSuperview];
}
}
- (void)showBufferedPages {
if (![previousPage.view isDescendantOfView:scrollView]) {
[scrollView addSubview:previousPage.view];
}
if (![nextPage.view isDescendantOfView:scrollView]) {
[scrollView addSubview:nextPage.view];
}
if (![currentPage.view isDescendantOfView:scrollView]) {
[scrollView addSubview:currentPage.view];
}
}
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
return currentPage.view;
}
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view {
[self hideBufferedPages];
}
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollViewParam withView:(UIView *)view atScale:(float)scale {
[self positionBufferedPages];
[self showBufferedPages];
}
- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
// nothing relating to the pdf page view
// but does set the center of some other subviews on top of the pdf page views
}
Не уверен, насколько это будет полезно, поскольку прокрутка не получает ввод, пока возникает проблема. Как упоминалось выше, страница pdf загружается в CATiledLayer, затем я оставляю iPad в покое (устройство не получает никаких входных данных), и CATiledLayer перерисовывается сам.
Я также пытался перехватывать вызовы setNeedsDisplay
, setNeedsDisplayInRect:
, setNeedsLayout
и setNeedsDisplayOnBoundsChange:
как в представлении, так и в мозаичный слой, но перерисовка происходит без вызова какой-либо из этих функций. drawLayer:inContext:
вызывается, конечно, но трассировка показывает только некоторые вызовы Quartz, запущенные в фоновом потоке (как и ожидалось, поскольку мозаичные слои подготавливают содержимое в фоновом режиме), так что это не имеет значения. помогите либо.
Заранее спасибо!