【问题标题】:How does the three20 gallery load images?three20 画廊如何加载图像?
【发布时间】:2011-10-30 17:15:43
【问题描述】:

在我的服务器上,每个图像有三个文件。

  • 缩略图文件,被裁剪为 128 x 128。
  • 一个小文件,我认为它最大为 160 x 240。
  • 一个大文件,我认为最大可以容纳 960 x 540。

我将这些 URL 返回到 three20 的画廊的方法如下所示:

- (NSString*)URLForVersion:(TTPhotoVersion)version {
    switch (version) {
        case TTPhotoVersionLarge:
            return _urlLarge;
        case TTPhotoVersionMedium:
            return _urlSmall;
        case TTPhotoVersionSmall:
            return _urlSmall;
        case TTPhotoVersionThumbnail:
            return _urlThumb;
        default:
            return nil;
    }
}

在调用这些不同的值时记录后,会发生以下情况:

  1. 加载缩略图页面时,仅调用缩略图(如预期的那样)
  2. 点击图像时,会显示缩略图,而不是小图像。
  3. 显示缩略图后,直接加载大图(不显示小图)。

我希望发生的事情如下

  1. 这是相同的(在主页上按预期加载缩略图)
  2. 点击图片时,先加载小图片
  3. 然后加载大图。

或者,以下

  1. 缩略图
  2. 直接到大图。

拇指的问题是我把它裁剪成正方形。

这意味着当缩略图图像显示在主查看器中时(点击拇指后),它是超大的,当加载大图像时,它会立即缩小以适应。

这看起来很糟糕,对我来说,如果它在缩略图视图中加载缩略图,然后在详细视图中加载小图像,然后是大图像,会更有意义。

有人对如何解决此问题有任何建议吗?
让拇指保持相同的纵横比是最好的方法吗?

我将不胜感激有关此问题的任何建议

【问题讨论】:

    标签: php iphone ios gallery three20


    【解决方案1】:

    查看three20源我可以看到TTPhotoView使用以下逻辑加载预览图像:

    - (BOOL)loadPreview:(BOOL)fromNetwork {
      if (![self loadVersion:TTPhotoVersionLarge fromNetwork:NO]) {
        if (![self loadVersion:TTPhotoVersionSmall fromNetwork:NO]) {
          if (![self loadVersion:TTPhotoVersionThumbnail fromNetwork:fromNetwork]) {
            return NO;
          }
        }
      }
      return YES;
    }
    

    问题在于,由于您的小图像位于服务器上而不是本地,代码会跳过图像并使用缩略图进行预览。

    我建议您最好的解决方案是编辑缩略图,使其具有与大图像相同的纵横比。这似乎是这个类的开发者所期望的!

    【讨论】:

    • 你认为(如果可能的话)在网络/速度方面强制three20在点击时加载小图像然后是大图像是否有意义?
    • 我认为这背后的想法是,如果您在本地已经有大版本或小版本,则将它们用作预览是有意义的,但如果您显示实际图像则需要更长的时间先下载小的,再下载大的。如果缩略图显示为占位符,这个过程会快得多,并且用户也应该感觉很快(尤其是在图像大小相同的情况下)。
    【解决方案2】:

    我认为你有三种方式可以去这里:

    1. 从TTPhotoView修改实际的loadPreview实现,使其实现您想要的逻辑(即,允许从网络加载小版本);

    2. 子类TTPhotoView并覆盖loadPreview,效果同上;

    3. 预缓存照片的小版本;即,修改/子类TTThumbView,以便在设置TTPhotoVersionThumbnail 时,预先缓存TTPhotoVersionSmall 版本;在这种情况下,作为本地已经存在的图像,loadPreview 无需外出网络即可找到它;顺便说一句,您可以在您认为适合您的应用程序的任何时间进行预缓存;要预先缓存图像,您将使用正确的 URL 创建一个 TTButton(这将同时处理 TTURLRequest 和缓存);

    4. 否则,您可以使用此UIImage category 即时进行从小版本到缩略图版本的裁剪;在这种情况下,您还应该通过覆盖imageForCurrentState 方法来调整绘制TTThumbView 的方式,以便在必要时应用裁剪。同样,您要么直接修改TTThumbView,要么将其子类化;或者,您可以在照片视图控制器中定义 layoutSubviews 并在那里修改您拥有的每个 TTThumbViews:

      - (void)layoutSubviews {
          [super layoutSubviews];
          for (NSInteger i = 0; i < _thumbViews.count; ++i) {
               TTThumbView* tv = [_thumbViews objectAtIndex:i];
               [tv contentForCurrentState].image = <cropped image>;
      

    如果你不想使用私有方法contentForCurrentState,你可以这样做:

                [tv addSubview:<cropped image>];
    

    如您所见,每个选项都有其优点和缺点; 1和2是最容易实现的,但是小版本会从网络加载,所以会增加一些延迟; 4 也是如此,尽管方法不同; 3 为您提供了响应速度最快的实现(没有额外的网络延迟,因为您预先缓存),但它可能是实现最复杂的解决方案(您可以下载图像并自己缓存它,或者使用 TTButton 来实现你,这不是很“干净”)。

    不管怎样,希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      • 2016-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多