Как сохранить четкость текста при масштабировании при использовании CATiledLayer для рендеринга PDF - PullRequest
1 голос
/ 23 марта 2011

Я реализовал просмотрщик PDF в моем приложении. Это вид прокрутки, который использует CATiledLayer для увеличения.

Более простой подход состоял бы в использовании QLPreviewController, который поддерживает просмотр PDF с контролем страниц и масштабированием, но мне нужен точный контроль над страницей PDF.

У меня работает зритель, но я бы хотел, чтобы перерисовка появилась раньше. В настоящее время он только перерисовывает текст, когда я увеличиваю изображение, чтобы удвоить размер (200%). Таким образом, текст выглядит размытым, пока вы не увеличите масштаб достаточно.

Я пробовал различные комбинации levelOfDetail и levelOfDetailBias, чтобы попытаться провести перерисовку раньше, но безрезультатно.

Вот код, который создает CATiledLayers:

  //get the pdf crop box rectangle
  CGPDFPageRef pageRef=[self.pdf getPdfPage:self.myPageNo];
  CGRect cropBox = CGRectIntegral(CGPDFPageGetBoxRect(pageRef, kCGPDFCropBox));

  //scale to size of the screen
  CGRect targetRect = self.view.bounds;
  CGFloat xScale = targetRect.size.width / cropBox.size.width;
  CGFloat yScale = targetRect.size.height / cropBox.size.height;
  self.scale = xScale < yScale ? xScale : yScale;

  //alway fill height of screen
  self.scale = yScale;

  //used to center the pdf horizontally
  self.xOffSet = (targetRect.size.width - cropBox.size.width*self.scale)/2;
  [self renderPDFPageToImage];
  CGRect boundsRect = self.view.bounds;

  //use a tiled layer for better performance
  CATiledLayer *tiledLayer = [CATiledLayer layer];
  tiledLayer.delegate = self;
  tiledLayer.tileSize = CGSizeMake(1024.0, 1024.0);
  tiledLayer.levelsOfDetail = 4;
  tiledLayer.levelsOfDetailBias = 4;
  tiledLayer.frame = boundsRect;

  self.myContentView = [[[UIView alloc] initWithFrame:boundsRect] autorelease];
  [self.myContentView.layer addSublayer:tiledLayer];

  CGRect viewFrame = self.view.frame;
  viewFrame.origin = CGPointZero;
  UIScrollView *_scrollView = [[UIScrollView alloc] initWithFrame:viewFrame];
  _scrollView.delegate = self;
  _scrollView.contentSize = boundsRect.size;

  _scrollView.maximumZoomScale = 4;
  [_scrollView addSubview:myContentView];
  //retain it
  self.scrollView=_scrollView;

  [self.view addSubview:_scrollView];
  [_scrollView release];

Пожалуйста, укажите мне правильное направление.

...