-imageNamed : 메서드가 Cached UIImage를 반환한다는 것을 알고 있지만 문제는 내 이미지 파일이 'Documents'에 저장되어 있고 -imageNamed : 메서드가 번들 만 검색하는 것입니다. 현재 저는 마지 못해) using -imageWithContentsOfFile : 'Documents'에서 내 이미지를 가져 오는 데는 동일하지 않습니다 ... 결과 이미지가 포함 된 UIImageView를 확대/축소하는 것은 고르지 않고 어색합니다. 그러나 -imageNamed :로 만든 이미지가 포함 된 동일한 UIImageView의 배율이 매우 부드럽게 나타납니다. 다시, -imageNamed :를 사용할 수 없다면 어떻게 캐시 된 UIImage를 'Documents'에서 얻을 수 있습니까?내 'Documents'디렉토리에서 캐시 된 UIImage를 가져 오는 방법은 무엇입니까?
답변
UIImages
자신을 -imageNamed:
처럼 캐시 할 수 있습니다. 그냥 그들을로드하고 그들을 누른다. NSDictionary
을 사용하여 그 (것)들에 붙들 수 있고 독자적으로 실행하십시오 -imageNamed:
그러나 나는 당신이 스케일링에 가지고있는 문제에 관하여 더 관지합니다. 이미지를 어떻게 문서로 가져오고, 크기를 조정하고, 번들에 저장된 동일한 이미지 파일을 테스트 했습니까? 나는 -imageNamed:
이 이것과 관련이 있는지 의심 스럽다. 번들에 약간의 압축이 적용되어 있다는 사실을 의심 할 것입니다. (실제로는 왜 이것이 실제로 중요 할 지에 대한 이론은 아직 없습니다.) 파일의 차이점이나 프로그램 나머지 부분의 차이점 (디스크 또는 CPU에서 충돌을 일으키는) 크기 조정 중에 작동합니다. 캐싱은이 문제와 관련이 없습니다.
나는 choppiness가 어디서 왔는지 알아 내려고하기 위해 Instruments와 프로파일 링을하고 싶습니다. 당신은 디스크, CPU, 메모리를 최대한 활용하고 있습니까? 병목은 무엇입니까?
이미지 캐시를 작성하는 것은 어떻습니까? 모든 조각이 제 위치에 있으며 이제 캡슐화하고 이미로드 한 이미지를 기록해야합니다.
가장 간단한 방법은 캐시 된 이미지와 명확한 캐시 저장 방법 NSMutableDictionary
다음과 같습니다
@interface UIImage (CacheExtensions)
+ (id)cachedImageWithContentsOfFile:(NSString *)path;
+ (void)clearCache;
@end
static NSMutableDictionary *UIImageCache;
@implementation UIImage (CacheExtensions)
+ (id)cachedImageWithContentsOfFile:(NSString *)path
{
id result;
if (!UIImageCache)
UIImageCache = [[NSMutableDictionary alloc] init];
else {
result = [UIImageCache objectForKey:path];
if (result)
return result;
}
result = [UIImage imageWithContentsOfFile:path];
[UIImageCache setObject:result forKey:path];
return result;
}
+ (void)clearCache
{
[UIImageCache removeAllObjects];
}
@end
참고 : 당신이 당신의 didReceiveMemoryWarning
방법에서 +[UIImage clearCache]
를 호출해야합니다. 또한 clearCache
은 사용되지 않은 항목뿐만 아니라 캐시의 모든 개체를 무효화합니다. UIImage
하위 클래스와 더 복잡한 캐싱 메커니즘이이를 해결해야 할 것입니다.
멋지고 간단한 솔루션입니다. +1 – iPadDeveloper2011
확실히 감사합니다. +1 –
나는 rpetrich가 제공 한 대답의 연장을 만들었고 imageName : 메소드를 대체하여 더 많은 대체 드롭을 추가했습니다. 주 번들을 먼저 검색 한 다음 캐시 디렉토리를 찾습니다. 물론 캐시 디렉토리를 문서 디렉토리로 변경할 수 있습니다.
@interface UIImage (CacheExtensions)
+ (UIImage *)imageNamed:(NSString *)name;
+ (void)clearCache;
@end
#import "UIImage+CacheExtensions.h"
static NSMutableDictionary *UIImageCache;
@implementation UIImage (CacheExtensions)
+ (UIImage *)imageNamed:(NSString *)name
{
id result;
if (!UIImageCache)
UIImageCache = [[NSMutableDictionary alloc] init];
else {
result = [UIImageCache objectForKey:name];
if (result) return result;
}
// First, check the main bundle for the image
NSString *imagePath = [[NSBundle mainBundle] pathForResource:name ofType:nil];
result = [UIImage imageWithContentsOfFileimagePath];
if(result) {
[UIImageCache setObject:result forKey:name];
return result;
}
// If not found, search for the image in the caches directory
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesImagePath = [[paths lastObject] stringByAppendingPathComponent:name];
result = [UIImage imageWithContentsOfFile:cachesImagePath];
if(result) {
[UIImageCache setObject:result forKey:name];
return result;
}
return nil;
}
+ (void)clearCache
{
[UIImageCache removeAllObjects];
}
@end
굉장! 이것을 잘 사용하십시오. :) –
범주의 메서드를 덮어 쓰면 안됩니다. 다른 이름을 사용하십시오. 여기를 참조하십시오 : http://stackoverflow.com/a/5272612/921573 –
또한 NSMutableDictionary 대신 NSCache를 사용하는 것이 좋습니다. 그저 거기에 있습니다. –
재미있군 ... 나는 지금 이것을 확인하고 다시 연락 할 것입니다. 감사합니다 – RexOnRoids
나는 문제를 해결했다. 그러나 나는 아직도 정확한 원인이 무엇인지 알지 못한다. 부드럽게 확장되는 이미지의 크기는 4kb 였고 짝수 크기 (2의 거듭 제곱)를 가졌으며 일반적인 PNG 파일 이었지만 잘록 해 보였던 이미지 크기는 200kb + 크기가 고르지 않았으며 Adobe Fireworks 형식 PNG 파일이었습니다. . 일단 파일 크기를 줄이고, 치수를 균등하게하고, 파일 유형을 변경했으며, 모든 것이 부드럽게 확장되기 시작했습니다. 왜 그 이유를 알고 있습니까?) – RexOnRoids