three20 gallery如何加载图片?

时间:2011-10-30 17:15:44

标签: php iphone ios gallery three20

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

  • 缩略图文件,将被裁剪为128 x 128。
  • 一个小文件,我的方面最大值为160 x 240。
  • 一个大文件,我的方面最大值为960乘540。

我将这些网址返回到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. 显示缩略图后,将直接加载大图像(不显示小图像)。
  4. 我希望发生的是以下

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

      1. 缩略图
      2. 直接拍到大图。
      3. 拇指的问题在于,我将它裁剪成方形。

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

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

        有没有人对如何解决此问题有任何建议?
        仅仅是让拇指具有相同的宽高比是最好的方法吗?

        我很感激有关此问题的任何建议

2 个答案:

答案 0 :(得分: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;
}

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

我建议您最好的解决方案是编辑缩略图,使其与大图像具有相同的宽高比。这就是这个类的开发人员似乎期待的!

答案 1 :(得分:0)

我认为你有三种方法可以去:

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

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

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

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

    - (void)layoutSubviews {
        [super layoutSubviews];
        for (NSInteger i = 0; i < _thumbViews.count; ++i) {
             TTThumbView* tv = [_thumbViews objectAtIndex:i];
             [tv contentForCurrentState].image = <cropped image>;
    
  5. 如果您不想使用私有方法contentForCurrentState,则可以执行以下操作:

                [tv addSubview:<cropped image>];
    

    正如您所看到的,每个选项都有其优点和缺点; 1和2是最容易实现的,但是小版本将从网络加载,因此它可能会增加一些延迟;虽然方法不同,但4也是如此。 3为您提供响应最快的实现(由于您预先缓存,没有来自网络的额外延迟),但它可能是最复杂的实现解决方案(您下载图像并自行缓存,或使用TTButton执行此操作)你,这有点不太“干净”)。

    无论如何,希望它有所帮助。