Aspek fit dan center UIImageView

183

Saya memiliki tampilan gambar, dideklarasikan secara terprogram, dan saya mengatur gambarnya, juga secara terprogram.

Namun, saya menemukan diri saya tidak dapat mengatur gambar agar sesuai dengan aspek dan menyelaraskan pusat ke tampilan gambar.

Dengan kata lain, saya ingin gambar:

  • Turunkan agar sesuai dengan aspek, jika gambar besar.
  • Tengahkan tetapi jangan perbesar, jika gambarnya kecil.

Bagaimana saya mendapatkannya?

Ravi Vooda
sumber
19
[yourImageView setContentMode: UIViewContentModeCenter]; dan pastikan jika imageView Frame lebih besar dari bingkai gambar. jika tidak maka letakkan [yourImageView setContentMode: UIViewContentModeAspectToFit];
Manohar Perepa
1
jika lagi syarat Bung @RyanPoolos
Manohar Perepa

Jawaban:

205

Hanya menempelkan solusinya:

Seperti yang dikatakan @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;
}

memecahkan masalah saya

Ravi Vooda
sumber
7
Cara yang lebih pendek untuk mengetahui gambar lebih kecil:CGRectContainsRect(imageView.bounds, {CGPointZero, image.size})
Cfr
@ CF mungkin lebih pendek, tapi tidak terlalu mudah dibaca. Pada saat yang sama saya mengusulkan untuk membagi sejalan dengan jika-pernyataan seperti ini: CGSize imageSize = ((UIImage*)imagesArray[i]).size;, CGSize viewSize = imageView.bounds.size, if (viewSize.width > imageSize.width && viewSize.height > imageSize.height) {.
Timur Bernikovich
1
Seharusnya UIViewContentModeScaleAspectFit
NoelHunter
imageView.contentMode = UIViewContentModeScaleAspectFit;
Arjay Waran
75

Dalam bahasa cepat kita dapat mengatur mode konten tampilan UIImage seperti berikut ini:

let newImgThumb = UIImageView(frame: CGRect(x: 10, y: 10, width: 100, height: 100))
newImgThumb.contentMode = .scaleAspectFit
Ali Raza
sumber
3
Ini meledakan gambar jika lebih kecil dari tampilan gambar, bertentangan dengan apa yang diminta OP.
Fishinear
18

Cepat

yourImageView.contentMode = .center

Anda dapat menggunakan opsi berikut untuk memposisikan gambar Anda:

  • scaleToFill
  • scaleAspectFit // konten diskalakan agar sesuai dengan aspek tetap. sisanya transparan
  • redraw // gambar ulang perubahan batas (panggilan -setNeedsDisplay)
  • center// isi tetap ukuran yang sama. posisi disesuaikan.
  • top
  • bottom
  • left
  • right
  • topLeft
  • topRight
  • bottomLeft
  • bottomRight
Jonas Deichelmann
sumber
12

Jawaban yang diperbarui

Ketika saya awalnya menjawab pertanyaan ini pada tahun 2014, tidak ada persyaratan untuk tidak memperbesar gambar dalam kasus gambar kecil. (Pertanyaannya diedit pada tahun 2015. ) Jika Anda memiliki persyaratan seperti itu, Anda memang perlu membandingkan ukuran gambar dengan ukuran gambarView dan menggunakan salah satu UIViewContentModeCenter(dalam hal gambar lebih kecil dari imageView) atau UIViewContentModeScaleAspectFitdalam semua kasus lainnya .

Jawaban asli

Mengatur contentMode pada imageView UIViewContentModeScaleAspectFitsudah cukup bagi saya. Tampaknya pusat gambar juga. Saya tidak yakin mengapa orang lain menggunakan logika berdasarkan gambar. Lihat juga pertanyaan ini: fit dan center aspek iOS

Nate Cook
sumber
1
Ini meledakan gambar jika lebih kecil dari tampilan gambar, bertentangan dengan apa yang diminta OP.
Fishinear
1
@fishinear Persyaratan untuk tidak memperbesar gambar ditambahkan ke pertanyaan setahun setelah saya menjawabnya: stackoverflow.com/posts/15499376/revisions
Nate Cook
10

Saya memecahkan masalah ini seperti ini.

  1. setImage ke UIImageView(dengan UIViewContentModeScaleAspectFit)
  2. dapatkan imageSize (CGSize imageSize = imageView.image.size)
  3. UIImageView mengubah ukuran. [imageView sizeThatFits:imageSize]
  4. pindahkan posisi ke tempat yang Anda inginkan.

Saya ingin menempatkan UIView di tengah atas UICollectionViewCell. jadi, saya menggunakan fungsi ini.

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

Ini bekerja untuk saya.

Nicejinux
sumber
8

Subkelas ini menggunakan pusat jika gambar tidak lebih besar dari tampilan, jika tidak turun skala. Saya menemukan ini berguna untuk UIImageViewyang mengubah ukuran.

Gambar yang ditampilkan lebih kecil dari tampilan untuk ukuran besar, tetapi lebih besar dari tampilan untuk ukuran kecil. Saya hanya ingin mengurangi, tetapi tidak naik.

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
sumber
8

Anda dapat mencapai ini dengan mengatur mode konten tampilan gambar ke UIViewContentModeScaleAspectFill.

Kemudian gunakan metode metode berikut untuk mendapatkan objek uiimage yang diubah ukurannya.

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

Diedit Di Sini (Versi Swift)

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
sumber
7
[your_imageview setContentMode:UIViewContentModeCenter];
souvickcse
sumber
17
Ini akan mengabaikan penskalaan
Skrew
2
Saya tidak tahu mengapa solusi seperti ini mendapat banyak upvotes. Orang ini jelas tidak membaca pertanyaan sama sekali.
lambat
7
let bannerImageView = UIImageView();
bannerImageView.contentMode = .ScaleAspectFit;
bannerImageView.frame = CGRectMake(cftX, cftY, ViewWidth, scrollHeight);
Antony Ouseph
sumber
Ini meledakan gambar jika lebih kecil dari tampilan gambar, bertentangan dengan apa yang diminta OP.
Fishinear
2

Untuk orang yang mencari ukuran 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
sumber