2015-03-25 3 views
0

Я создаю эскизы для ячеек в коллекции, а некоторые изображения не поддерживают их соотношение сторон. Они выглядят растянутыми, то есть изображение выглядит короче и толще. Странно, что это не происходит для изображений, снятых камерой из моего приложения. Это происходит только для любых импортированных изображений, например из библиотеки фотографий (даже если они были сделаны с камерой) и для нескольких изображений, которые я импортировал из Интернета. Режим содержимого изображения изображения ячейки установлен в UIViewContentModeScaleAspectFit. Я также использую SDWebImage для кэширования.Создание эскизов для UICollectionview, не поддерживающих аспект

Может ли кто-нибудь сказать мне, как убедиться, что соотношение сторон остается неизменным для всех изображений? Вот код, я использую ...

- (UIImage *)imageByScalingToSize:(CGSize)size 
{ 
    UIGraphicsBeginImageContextWithOptions(size, YES, 0.0); 
    [self drawInRect:CGRectMake(0, 0, size.width, size.height)]; 
    UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return resizedImage; 
} 

Код внутри cellForItemAtIndexPath ...

if ([self.allCacheKeys count] > 0) { 
    // check to see if the cacheKeys arrays contains any keys (URLs) 
    NSString *cacheKey = self.allCacheKeys[indexPath.row]; 
    if (cacheKey) { 
     [self.imageCache queryDiskCacheForKey:cacheKey done:^(UIImage *image, SDImageCacheType cacheType) { 
      if (image) { 
       // image is found in the cache 
       NSLog(@"Image found in cache!"); 
       UIImage *thumbnail = [image imageByScalingToSize:CGSizeMake(ITEM_SIZE, ITEM_SIZE)]; 
       cell.imageView.image = thumbnail; 
      } 
     } 
    } 
} 

ответ

0

Проверьте следующий код, который сохраняет соотношение сторон изображения, которые вы загружаете из Интернета.

+(UIImage*)imageWithImage: (UIImage*) sourceImage scaledToWidth: (float) i_width 
{ 
    float oldWidth = sourceImage.size.width; 
    float scaleFactor = i_width/oldWidth; 

    float newHeight = sourceImage.size.height * scaleFactor; 
    float newWidth = oldWidth * scaleFactor; 

    UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight)); 
    [sourceImage drawInRect:CGRectMake(0, 0, newWidth, newHeight)]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();  
    UIGraphicsEndImageContext(); 
    return newImage; 
} 

или делает следующий код также же:

+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize 
{ 
    UIGraphicsBeginImageContext(newSize); 
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();  
    UIGraphicsEndImageContext(); 
    return newImage; 
} 
+0

Первый метод, который вы Написал работал, но только если я установить режим содержания ImageView в клетке, чтобы UIViewContentModeScaleAspectFill и установить clipsToBounds ДА. Но я заметил, что при использовании режима AspectFill я получил тот же результат с моим исходным кодом. Спасибо за помощь. – SonnyB

Смежные вопросы