CATiledLayer удаляется и обновляется при увеличении масштаба в iPad 3-го поколения

У меня возникла проблема перерисовки в 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, запущенные в фоновом потоке (как и ожидалось, поскольку мозаичные слои подготавливают содержимое в фоновом режиме), так что это не имеет значения. помогите либо.

Заранее спасибо!

5
задан Altealice 8 May 2012 в 07:30
поделиться