Атрибут UIImageView, розміщення та центр


183

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

Однак я не можу встановити зображення так, щоб воно відповідало аспекту та вирівнювало центр по центру зображення.

Іншими словами, я хочу, щоб зображення:

  • Якщо зображення велике, зменшіть його вниз до розміру.
  • Центруйте, але не збільшуйте масштаб, якщо зображення невелике.

Як я можу це отримати?


19
[вашImageView setContentMode: UIViewContentModeCenter]; і переконайтеся, що imageView Frame більше, ніж кадр зображення. якщо це не тоді, розмістіть [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
Це підірває зображення, якщо воно менше, ніж перегляд зображення, всупереч тому, що вимагала ОП.
рибалкапоруч

18

Швидкий

yourImageView.contentMode = .center

Ви можете використовувати наступні параметри для розміщення зображення:

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

12

Оновлена ​​відповідь

Коли я спочатку відповідав на це питання у 2014 році, не було вимоги не збільшувати зображення у випадку невеликого зображення. (Питання було відредаговано у 2015 році .) Якщо у вас є така вимога, вам дійсно потрібно буде порівняти розмір зображення з розміром imageView і використовувати або UIViewContentModeCenter(у випадку зображення, меншого, ніж imageView) абоUIViewContentModeScaleAspectFit у всіх інших випадках .

Оригінальна відповідь

UIViewContentModeScaleAspectFitДля мене вистачило встановлення imageView contentMode для. Здається, в центрі зображень також. Я не впевнений, чому інші використовують логіку на основі зображення. Дивіться також це запитання: розміщення та центр iOS


1
Це підірває зображення, якщо воно менше, ніж перегляд зображення, всупереч тому, що вимагала ОП.
рибалкапоруч

1
@fishinear Вимога щодо не масштабування зображення була додана до питання через рік після того, як я відповів на нього: stackoverflow.com/posts/15499376/reitions
Nate Cook

10

Я вирішив цю проблему так.

  1. setImage в 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];
}

Це працює для мене.


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
        }
    }
}

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;
}

Тут відредаговано (швидка версія)

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;
}

7
[your_imageview setContentMode:UIViewContentModeCenter];

17
Це ігнорує масштабування
Skrew

2
Я не знаю, чому такі рішення отримали так багато відгуків. Ця особа явно не прочитала питання.
повільний

7
let bannerImageView = UIImageView();
bannerImageView.contentMode = .ScaleAspectFit;
bannerImageView.frame = CGRectMake(cftX, cftY, ViewWidth, scrollHeight);

Це підірває зображення, якщо воно менше, ніж перегляд зображення, всупереч тому, що вимагала ОП.
рибалкапоруч

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.