Сделать округлое изображение с помощью раскадровки

Я хочу сделать округленное фото из Facebook, но изображение всегда масштабируется.

Итак, у меня есть раскадровка со следующими параметрами: http://prntscr.com/5bpuqy

выровняйте по центру X, выровняйте по центру Y, ширина равна 72, высота равна 72. Я понимаю, что проблема может быть в 72/72, но режим изображения в раскадровке - "Соотношение сторон"

Я вызываю свои методы для загрузки изображения по URL-адресу, а затем делаю его угловым с радиусом.

// call 
[UIImage setRoundImageView:self.p_photo WithURL:[p_user fullURL] withCornerSize:37];

+ (void)setRoundImageView:(UIImageView *)imageView WithURL:(NSURL *)url withCornerSize:(CGFloat)corner
    {
    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){

        [[SDWebImageManager sharedManager] downloadImageWithURL:url
                                                        options:0
                                                       progress:^(NSInteger receivedSize, NSInteger expectedSize) {

                                                       } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {

                                                           if (image && finished)
                                                           {
                                                               [self setRoundImage:image forImageView:imageView withCornerSize:corner];
                                                           }
                                                       }];
    });
 }

+ (void)setRoundImage:(UIImage *)image forImageView:(UIImageView *)imageView withCornerSize:(CGFloat)corner
{
    dispatch_async(dispatch_get_main_queue(), ^{

        UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, [UIScreen mainScreen].scale);
        [[UIBezierPath bezierPathWithRoundedRect:imageView.bounds
                                    cornerRadius:corner] addClip];
        [image drawInRect:imageView.bounds];
        imageView.image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    });
}

person Vitaliy Zarubin    schedule 30.11.2014    source источник
comment
Чтобы закруглить углы вашего изображения, используйте ответ на этот вопрос SO: >stackoverflow.com/questions/1509547/uiview-с-закругленными углами   -  person Daniel T.    schedule 30.11.2014
comment
Хорошо округлено, вся беда, изображение выглядит масштабированным   -  person Vitaliy Zarubin    schedule 30.11.2014
comment
Используйте ответ в этом вопросе SO, чтобы округлить представление, посмотрите, решит ли это проблему масштабирования.   -  person Daniel T.    schedule 30.11.2014
comment
Нет, он округляется хорошо, как и раньше, но основная проблема с масштабом, как я думаю, из-за раскадровки, в которой я установил изображение как ширину = 72, высоту = 72, поэтому оно все равно масштабируется до 72 * 72   -  person Vitaliy Zarubin    schedule 30.11.2014


Ответы (1)


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

+ (void)setRoundImageView:(UIImageView *)imageView WithURL:(NSURL *)url
{
    // you don't need to wrap this in a dispatch queue, SDWebImageManager takes care of that for you.
    [[SDWebImageManager sharedManager] downloadImageWithURL:url options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
    } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
        if (image && finished) {
            [self setRoundImage:image forImageView:imageView];
        }
    }];
}

+ (void)setRoundImage:(UIImage *)image forImageView:(UIImageView *)imageView
{
    // you don't need to wrap this in a dispatch queue, it will be called on the main thread.
    // you don't need to manually draw the image into the image view. Just add the image to the image view and let it do its thing.
    imageView.layer.cornerRadius = CGRectGetHeight(imageView.bounds) / 2;
    imageView.layer.masksToBounds = YES;
    [imageView setImage:image];
}

И убедитесь, что в раскадровке для просмотра изображения установлен режим «Заливка пропорций».

person Daniel T.    schedule 30.11.2014
comment
Мне помогло, но есть еще одна проблема. Когда я вызываю этот метод дважды, то радиус угла в первый раз равен 35, а во второй раз — 70. Я думаю, это из-за SDWebImageCache? Как решить эту проблему, чтобы я мог повторно использовать ее из кеша? - person Vitaliy Zarubin; 30.11.2014
comment
Единственный способ, которым угол будет отличаться, - это если размер изображения будет другим. Либо вы меняете размер вашего изображения, либо вы передаете другое изображение. Значение angleRadius не имеет ничего общего с SDWebImageCache. - person Daniel T.; 30.11.2014
comment
хорошо, спасибо, проблема из-за метода viewWilLAppear, есть неверные значения в viewWillAppear: и исправьте в viewDidAppear: - person Vitaliy Zarubin; 30.11.2014