UIImageView аспект подходит и центр

183

У меня есть представление изображения, объявленное программно, и я устанавливаю его изображение также программно.

Однако я не могу настроить изображение так, чтобы оно соответствовало аспекту и выровняло центр по виду изображения.

Другими словами, я хочу, чтобы изображение:

  • Уменьшите, чтобы соответствовать аспекту, если изображение большое.
  • Центрируйте, но не увеличивайте масштаб, если изображение маленькое.

Как мне это получить?

Рави Вуда
источник
19
[yourImageView setContentMode: UIViewContentModeCenter]; и убедитесь, что кадр imageView больше, чем кадр изображения. если это не так, поместите [yourImageView setContentMode: UIViewContentModeAspectToFit];
Манохар Перепа
1
если еще условие, чувак @RyanPoolos
Манохар Перепа

Ответы:

205

Просто вставьте решение:

Как сказал @manohar

imageView.contentMode = UIViewContentModeCenter;
if (imageView.bounds.size.width > ((UIImage*)imagesArray[i]).size.width && imageView.bounds.size.height > ((UIImage*)imagesArray[i]).size.height) {
       imageView.contentMode = UIViewContentModeScaleAspectFit;
}

решил мою проблему

Рави Вуда
источник
7
Более короткий способ узнать изображение меньше:CGRectContainsRect(imageView.bounds, {CGPointZero, image.size})
Cfr
@Cfr может быть короче, но не так читабельно. В то же время я предлагаю разделить строку с утверждением , если-как это: CGSize imageSize = ((UIImage*)imagesArray[i]).size;, CGSize viewSize = imageView.bounds.size, if (viewSize.width > imageSize.width && viewSize.height > imageSize.height) {.
Тимур Берникович
1
Должен быть UIViewContentModeScaleAspectFit
NoelHunter
imageView.contentMode = UIViewContentModeScaleAspectFit;
Арджай Варан
75

В быстром языке мы можем установить режим содержимого представления UIImage следующим образом:

let newImgThumb = UIImageView(frame: CGRect(x: 10, y: 10, width: 100, height: 100))
newImgThumb.contentMode = .scaleAspectFit
Али Раза
источник
3
Это взрывает изображение, если оно меньше, чем изображение, вопреки тому, что запрашивал OP.
рыбопромыслов
18

стриж

yourImageView.contentMode = .center

Вы можете использовать следующие параметры для позиционирования изображения:

  • scaleToFill
  • scaleAspectFit // содержимое масштабируется, чтобы соответствовать фиксированному аспекту. остаток прозрачен
  • redraw // перерисовываем изменение границ (вызывает -setNeedsDisplay)
  • center// содержимое остается того же размера. позиционируется отрегулировано.
  • top
  • bottom
  • left
  • right
  • topLeft
  • topRight
  • bottomLeft
  • bottomRight
Йонас Дейхельманн
источник
12

Обновленный ответ

Когда я первоначально ответил на этот вопрос в 2014 году, не было требования не увеличивать изображение в случае маленького изображения. (Вопрос был отредактирован в 2015 году .) Если у вас есть такое требование, вам действительно нужно сравнить размер изображения с размером изображения и использовать либо UIViewContentModeCenter(в случае изображения меньше, чем изображение) или UIViewContentModeScaleAspectFitво всех других случаях. ,

Оригинальный ответ

UIViewContentModeScaleAspectFitДля меня было достаточно установить contentMode для imageView . Кажется, что центрирование изображений также. Я не уверен, почему другие используют логику, основанную на изображении. Смотрите также вопрос: IOS аспект подгонку и центр

Нейт Кук
источник
1
Это взрывает изображение, если оно меньше, чем изображение, вопреки тому, что запрашивал OP.
рыбопромыслов
1
@fishinear Требование не масштабировать изображение было добавлено к вопросу через год после того, как я на него ответил: stackoverflow.com/posts/15499376/revisions
Нейт Кук,
10

Я решил эту проблему следующим образом.

  1. setImage to UIImageViewUIViewContentModeScaleAspectFit)
  2. получить imageSize (CGSize imageSize = imageView.image.size)
  3. UIImageView размер. [imageView sizeThatFits:imageSize]
  4. переместить положение, где вы хотите.

Я хотел поставить UIView в верхнем центре UICollectionViewCell. Итак, я использовал эту функцию.

- (void)setImageToCenter:(UIImageView *)imageView
{
    CGSize imageSize = imageView.image.size;
    [imageView sizeThatFits:imageSize];
    CGPoint imageViewCenter = imageView.center;
     imageViewCenter.x = CGRectGetMidX(self.contentView.frame);
    [imageView setCenter:imageViewCenter];
}

Меня устраивает.

Nicejinux
источник
8

Этот подкласс использует центр, если изображение не больше, чем представление, в противном случае оно уменьшается. Я нашел это полезным для UIImageViewизменения размера.

Отображаемое изображение меньше, чем вид для больших размеров, но больше, чем вид для небольших размеров. Я хочу, чтобы это только уменьшало, но не увеличивало.

class CenterScaleToFitImageView: UIImageView {
    override var bounds: CGRect {
        didSet {
            adjustContentMode()
        }
    }

    override var image: UIImage? {
        didSet {
            adjustContentMode()
        }
    }

    func adjustContentMode() {
        guard let image = image else {
            return
        }
        if image.size.width > bounds.size.width ||
            image.size.height > bounds.size.height {
            contentMode = .ScaleAspectFit
        } else {
            contentMode = .Center
        }
    }
}
orkoden
источник
8

Вы можете достичь этого, установив режим отображения содержимого для UIViewContentModeScaleAspectFill.

Затем используйте следующий метод метода, чтобы получить измененный объект uiimage.

- (UIImage*)setProfileImage:(UIImage *)imageToResize onImageView:(UIImageView *)imageView
{
    CGFloat width = imageToResize.size.width;
    CGFloat height = imageToResize.size.height;
    float scaleFactor;
    if(width > height)
    {
        scaleFactor = imageView.frame.size.height / height;
    }
    else
    {
        scaleFactor = imageView.frame.size.width / width;
    }

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(width * scaleFactor, height * scaleFactor), NO, 0.0);
    [imageToResize drawInRect:CGRectMake(0, 0, width * scaleFactor, height * scaleFactor)];
    UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return resizedImage;
}

Отредактировано здесь (Swift Version)

func setProfileImage(imageToResize: UIImage, onImageView: UIImageView) -> UIImage
{
    let width = imageToResize.size.width
    let height = imageToResize.size.height

    var scaleFactor: CGFloat

    if(width > height)
    {
        scaleFactor = onImageView.frame.size.height / height;
    }
    else
    {
        scaleFactor = onImageView.frame.size.width / width;
    }

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(width * scaleFactor, height * scaleFactor), false, 0.0)
    imageToResize.drawInRect(CGRectMake(0, 0, width * scaleFactor, height * scaleFactor))
    let resizedImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return resizedImage;
}
Manish
источник
7
[your_imageview setContentMode:UIViewContentModeCenter];
souvickcse
источник
17
Это будет игнорировать масштабирование
Skrew
2
Я не знаю, почему такие решения получили столько голосов. Этот человек явно не читал вопрос вообще.
медленно
7
let bannerImageView = UIImageView();
bannerImageView.contentMode = .ScaleAspectFit;
bannerImageView.frame = CGRectMake(cftX, cftY, ViewWidth, scrollHeight);
Энтони Оусеф
источник
Это взрывает изображение, если оно меньше, чем изображение, вопреки тому, что запрашивал OP.
рыбий день
2

Для тех, кто ищет изменение размера UIImage,

@implementation UIImage (Resize)

- (UIImage *)scaledToSize:(CGSize)size
{
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);
    [self drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height)];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

- (UIImage *)aspectFitToSize:(CGSize)size
{
    CGFloat aspect = self.size.width / self.size.height;
    if (size.width / aspect <= size.height)
    {
        return [self scaledToSize:CGSizeMake(size.width, size.width / aspect)];
    } else {
        return [self scaledToSize:CGSizeMake(size.height * aspect, size.height)];
    }
}

- (UIImage *)aspectFillToSize:(CGSize)size
{
    CGFloat imgAspect = self.size.width / self.size.height;
    CGFloat sizeAspect = size.width/size.height;

    CGSize scaledSize;

        if (sizeAspect > imgAspect) { // increase width, crop height
            scaledSize = CGSizeMake(size.width, size.width / imgAspect);
        } else { // increase height, crop width
            scaledSize = CGSizeMake(size.height * imgAspect, size.height);
        }
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClipToRect(context, CGRectMake(0, 0, size.width, size.height));
    [self drawInRect:CGRectMake(0.0f, 0.0f, scaledSize.width, scaledSize.height)];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

@end
Karim
источник