Как я могу сделать UIScrollView с большим изображением, которое отображается быстро (как Photos.app)? - PullRequest
1 голос
/ 15 января 2011

Я пытаюсь создать простую программу просмотра изображений для просмотра изображения с полным разрешением в ALAssetRepresentation. Оказывается, не все так просто.

Мой первый подход состоял в том, чтобы просто создать большой UIImageView внутри UIScrollView. Хотя это работало, это было очень медленно.

При использовании приложения «Фотографии» при касании изображения мгновенно открывается увеличенная версия. Сначала рисуется изображение с очень низким разрешением. Но вскоре появляется изображение с более высоким разрешением. Кроме того, если я увеличу масштаб, изображение сначала будет иметь более низкое разрешение, а затем увеличится.

Я ознакомился с основным докладом WWDC 2010 № 104, где описано, как работает Photos.app. Но как мне это реализовать? В основной записи демонстрация использует предварительно мозаичные изображения, чего я не могу получить из ALAssetRepresentation, просто так. Я попытался просто загрузить версию с полным разрешением и нарисовать ее с помощью CATiledLayer, и хотя масштабирование et.c не слишком медленное, оно слишком медленное при рисовании плиток.

Кэширует ли Photos.app версию всех изображений в более низком разрешении или что происходит? Некоторые советы о том, что делать, были бы полезны.

1 Ответ

0 голосов
/ 15 января 2011

Да, Photos.app кэширует изображения с более низким разрешением. Хорошая новость заключается в том, что вы также можете использовать эти кэшированные версии. Вы, вероятно, уже знаете о свойстве fullScreenImage ALAssetRepresentation и свойстве миниатюр ALAsset. Они должны быть загружены намного быстрее.

Что я нашел с изображениями высокого разрешения, так это то, что простая загрузка может занять 1-2 секунды, поэтому я предполагаю, что простая загрузка изображения с высоким разрешением на заднем плане может помочь вам.

Итак, как загрузить версию изображения с низким разрешением, а затем переключиться на версию с высоким разрешением, когда у вас есть i ?. Это может быть немного сложно, но, надеюсь, это поможет вам начать. Поскольку вы используете AssetsLibrary, вам придется использовать iOS 4, что является хорошей новостью, поскольку вы можете сделать это довольно легко с помощью блоков и GCD / libdispatch. Я рад, что вы смотрите видео WWDC - проверьте сеансы 206 и 211, чтобы получить много полезной информации о GCD.

Основная идея заключается в том, что вы собираетесь отобразить версию с более низким разрешением в основном потоке, затем попросить фоновый поток загрузить изображение с полным разрешением, а затем попросить CATiledLayer переключиться на изображение с полным разрешением. *

- (void)displayAsset:(ALAssetRepresentation *)asset {
  UIImage *lowresImage = [UIImage imageWithCGImage:asset.fullScreenImage
                               orientation:asset.orientation scale:asset.scale];
  // Add code here to display the lowresImage

  dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
    ^ {
      // Load the full resolution image from the asset
      UIImage *highresImage = [UIImage imageWithCGImage:asset.fullResolutionImage
                                   orientation:asset.orientation
                                   scale:asset.scale];

      // Once done, tell the main thread to display the tiles
      dispatch_async( dispatch_get_main_queue(),
        ^ {
          // Code to swap out the lowresImage for highresImage
        });
    });

}
...