在我的服务器上,每张图片有三个文件。
我将这些网址返回到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;
}
}
在调用这些不同的值时记录后,会发生以下情况:
我希望发生的是以下
或者,以下
拇指的问题在于,我将它裁剪成方形。
这意味着当在主浏览器中显示缩略图图像(在点击拇指之后)时,它会过大,当加载大图像时,它会立即缩小以适应。
这看起来非常糟糕,对我来说,如果它在缩略图视图中加载拇指,然后是小图像,在详细视图中跟随大图像,则会更有意义。
有没有人对如何解决此问题有任何建议?
仅仅是让拇指具有相同的宽高比是最好的方法吗?
我很感激有关此问题的任何建议
答案 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)
我认为你有三种方法可以去:
修改loadPreview
的实际TTPhotoView
实现,以便它实现您想要的逻辑(即允许从网络加载小版本);
子类TTPhotoView
并覆盖loadPreview
,效果与上述相同;
预先缓存照片的小版本;即,修改/子类TTThumbView
,以便在设置TTPhotoVersionThumbnail
时,它预先缓存TTPhotoVersionSmall
版本;在这种情况下,作为本地已经存在的图像,loadPreview
将无需外出网络即可找到它;另外,您可以在您认为适合您的应用的任何时候进行预缓存;预先缓存图像,您将使用正确的URL创建TTButton
(这将同时处理TTURLRequest和缓存);
否则,您可以使用此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>;
如果您不想使用私有方法contentForCurrentState
,则可以执行以下操作:
[tv addSubview:<cropped image>];
正如您所看到的,每个选项都有其优点和缺点; 1和2是最容易实现的,但是小版本将从网络加载,因此它可能会增加一些延迟;虽然方法不同,但4也是如此。 3为您提供响应最快的实现(由于您预先缓存,没有来自网络的额外延迟),但它可能是最复杂的实现解决方案(您下载图像并自行缓存,或使用TTButton执行此操作)你,这有点不太“干净”)。
无论如何,希望它有所帮助。