UIImageView, setClipsToBounds и то, как мои изображения теряют голову

Я разрабатываю приложение iOS 4.

Я использую этот код на UIImageView на UITableViewCell:

cell.photo.contentMode = UIViewContentModeScaleAspectFill;
[cell.photo setClipsToBounds:YES];

Мои изображения выше ширины, и когда я устанавливаю UIViewContentModeScaleAspectFill, изображения масштабируются, чтобы соответствовать ширине с шириной UIImageView. При этом изображение становится больше, чем UIImageView, и я вижу его вне UIImageView.

Затем мне нужно использовать setClipsToBounds:YES, чтобы не допускать этого, но теперь все мои изображения теряют голову.

Есть ли способ использовать UIViewContentModeScaleAspectFill и верхний левый угол с верхним левым углом UIImageView? Если мне нужно потерять часть изображения, я предпочитаю потерять ноги, чтобы его голова.

ОБНОВЛЕНИЕ

Я использую sdWebImage framework, и я использовал ответ Вадима Елагина, и теперь это мой код:

[cell.photo setImageWithURL:[NSURL URLWithString:entry.photo]
               placeholderImage:[UIImage imageNamed:@"placeholder.png"]
                        success:^(UIImage *image) {
                            CGFloat scaleX = cell.photoBorder.bounds.size.width / image.size.width;
                            CGFloat scaleY = cell.photoBorder.bounds.size.height / image.size.height;
                            CGFloat scale = MAX(scaleX, scaleY);
                            cell.photo.frame = CGRectMake(0, 0, image.size.width * scale, image.size.height * scale);
                            cell.photo.image = image;
                        } 
                        failure:nil];

Мне нужно подождать, чтобы загрузить все изображения и перезагрузить UITableView, чтобы увидеть правильное изображение в правой ячейке (это происходит из-за того, что изображения кэшируются и загружаются быстрее).

Вместо использования cell.photo.frame и cell.photo.image мне нужно перейти к блоку indexPath.row, чтобы получить правую ячейку.

Я мог бы добавить новый метод в UIImageView + WebCache:

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder success:(void (^)(UIImage *image, NSInteger row))success failure:(void (^)(NSError *error))failure;
{
    [self setImageWithURL:url placeholderImage:placeholder options:0 success:success failure:failure];
}

Но если я это сделаю, я получаю сообщение об ошибке:

[self setImageWithURL:url placeholderImage:placeholder options:0 success:success failure:failure];

Потому что теперь успех не типа (void (^)(UIImage *image))

Знаете ли вы, как я могу исправить эту проблему?

Ответ 1

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

Создайте представление с фреймом, который вы сейчас указываете для своего изображения, сделайте imageView своим подвью. Установите view.clipsToBounds = YES.

Затем, когда вы назначаете изображение, сделайте что-то вроде

CGFloat scaleX = view.bounds.size.width / image.size.width;
CGFloat scaleY = view.bounds.size.height / image.size.height;
CGFloat scale = MAX(scaleX, scaleY);
imageView.frame = CGRectMake(0, 0, image.size.width * scale, image.size.height * scale);
imageView.image = image;

Ответ 2

Нет встроенного способа сделать это, но вы можете сделать это вручную:

UIGraphicsBeginImageContext(CGSizeMake(desiredWidth, desiredHeight));

[originalImage drawAtPoint...];
...

UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();